【start:20231104】
文章目录
简介
在使用Python进行数据处理和科学计算时,我们经常会遇到需要读取或写入npy文件的情况。npy文件是NumPy库中用于存储多维数组数据的二进制文件格式,它能够高效地保存和加载大规模的数组数据。
npy文件基础
import library
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
make and save npy file
# make and save npy file
# 创建一个示例列表
data_list = [1, 2, 3, 4, 5]
# 将列表转换为DataFrame
df = pd.DataFrame(data_list, columns=['Data'])
# 将DataFrame转换回NumPy数组
data_array = df.to_numpy()
# 将NumPy数组保存为.npy文件
np.save('data_array.npy', data_array)
load npy file
# load npy file
# 加载npy文件
data_array = np.load('data_array.npy')
# 将数据转换为Pandas DataFrame
df = pd.DataFrame(data_array)
# 打印DataFrame
print(df)
np.dtype问题
参考资料
【ref】如何将深度学习的float32图像转为Unit8格式以方便cv2使用
涉及到np.dtype问题时,应该注意什么?
在处理NumPy数据类型(np.dtype
)时,特别是在涉及不同的数据类型(如uint8
、float64
等)时,你需要注意以下几点:
-
数据范围和精度: 不同的数据类型具有不同的值范围和精度。例如,
uint8
表示无符号8位整数,范围为0到255,而float64
表示双精度浮点数,具有更高的精度但占用更多的内存空间。确保选择适当的数据类型来存储你的数据,以避免数据丢失或溢出的问题。 -
内存占用: 数据类型不同会影响所占用的内存空间。例如,
uint8
通常占用比float64
更少的内存空间。在处理大型数据集时,选择适当的数据类型可以减少内存占用,提高程序的性能。 -
计算和操作: 不同的数据类型在进行数学运算和操作时会表现出不同的行为。某些数据类型可能不支持特定的操作或会导致精度损失。在进行计算之前,了解所使用的数据类型以及其行为特性是很重要的。
-
数据转换: 在数据处理过程中,可能需要进行数据类型的转换。要注意数据转换可能会导致精度损失或数据溢出。确保在进行数据类型转换时选择合适的方法,以保持数据的完整性和准确性。
-
存储和读取: 在存储和读取数据时,确保使用正确的数据类型。选择适当的数据类型可以确保数据的完整性并减少存储和读取过程中的错误。
通过了解不同数据类型的特点和使用场景,你可以更好地管理数据,并确保在处理数据时不会出现潜在的问题和错误。
float32和uint8数据类型互转
float32
和uint8
是常见的NumPy数据类型,它们具有不同的数据范围和精度。下面是它们各自的数据范围:
-
float32
: 它是32位浮点数类型,通常用于表示单精度浮点数(用于表示 0 到 1的带有小数部分的实数)。它可以表示大约 7 个有效数字,并具有较高的精度。其值范围约为 − 3.4 × 1 0 38 到 3.4 × 1 0 38 -3.4 × 10^{38} 到 3.4 × 10^{38} −3.4×1038到3.4×1038 。 -
uint8
: 它是8位无符号整数类型,用于表示 0 到 255 之间的整数。它通常用于表示像素值等在 0 到 255 之间的数据,例如图像数据中的灰度值或颜色通道值。
在进行数据转换时,要注意数据范围的差异。转换时确保数据不会溢出或丢失精度。对于float32
到uint8
的转换,你需要将float32
数据乘以 255 并进行取整操作以保持在 0 到 255 之间的 uint8
范围内。而对于uint8
到float32
的转换,你需要将uint8
数据除以 255 以保持在 0 到 1 之间的范围内;下面是两个示例:
- 从
float32
到uint8
的转换:
import numpy as np
# 创建一个示例的float32类型数组
float_array = np.array([0.1, 0.5, 0.9], dtype=np.float32)
# 将float32类型数组转换为uint8类型数组
uint8_array = (float_array * 255).astype(np.uint8)
print("uint8 array:", uint8_array)
- 从
uint8
到float32
的转换:
import numpy as np
# 创建一个示例的uint8类型数组
uint8_array = np.array([50, 100, 200], dtype=np.uint8)
# 将uint8类型数组转换为float32类型数组
float_array = uint8_array.astype(np.float32) / 255
print("float32 array:", float_array)
在这两个示例中,我们分别将float32
类型的数组转换为uint8
类型的数组以及将uint8
类型的数组转换为float32
类型的数组。通过在astype()
方法中指定目标数据类型,你可以实现不同数据类型之间的转换。
npy文件用于处理image和mask
example dataset(PanNuke)
以处理PanNuke
数据集为例
【dataset link】PanNuke dataset download
J. Gamper, N. A. Koohbanani, K. Benes, S. Graham, M. Jahanifar, S. A. Khurram, A. Azam, K. Hewitt, and N. Rajpoot, “PanNuke Dataset Extension, Insights and Baselines,” arXiv preprint arXiv:2003.10778, 2020.
image class type(一维数组:N)
## image_type (一维数组:N)
path = "/home/linxq/dataset/cell/pannuke/Fold 3/images/fold3/types.npy"
# 从.npy文件中加载数据
data = np.load(path)
print(data.shape)
# 将数据转换为Pandas DataFrame
df = pd.DataFrame(data)
# 打印DataFrame
print(df)
image(四维数组3通道:N, 256, 256, 3)
# image (四维数组3通道:N, 256, 256, 3)
path_image = "/home/linxq/dataset/cell/pannuke/Fold 3/images/fold3/images.npy"
# 从.npy文件中加载数据
data_image = np.load(path_image)
print(data_image.shape)
# 数据归一化
data_image_normalized = data_image.astype('float32') / 255.0
# 选择要展示的图像数量
num_images_to_show = 5
# 从data_normalized中随机选择五张图像
random_indices = np.random.choice(len(data_image_normalized), num_images_to_show, replace=False)
print('random_indices: ', random_indices)
# 创建子图
fig, axes = plt.subplots(1, num_images_to_show, figsize=(15, 3))
# 展示随机选择的图像
for i, idx in enumerate(random_indices):
axes[i].imshow(data_image_normalized[idx])
axes[i].axis('off') # 关闭坐标轴
plt.show()
image pixel Distribution hist(分布图)
# image pixel Distribution hist
def draw_hist(data, data_name):
plt.hist(data.flatten(), bins=50, color='b', alpha=0.7, rwidth=0.85)
title_name = 'Pixel Distribution ' + data_name
plt.title(title_name)
plt.xlabel('Pixel Value')
plt.ylabel('Percentage')
plt.grid(axis='y', alpha=0.75)
path = "/home/linxq/dataset/cell/pannuke/Fold 3/images/fold3/images.npy"
# 从.npy文件中加载数据
data = np.load(path)
print(data.shape)
# 数据归一化
data_normalized = data.astype('float32') / 255.0
plt.figure(figsize=(12, 4))
plt.subplot(1, 2, 1)
# 绘制原始数据的像素分布百分比图
draw_hist(data, 'data')
plt.subplot(1, 2, 2)
# # 绘制归一化数据的像素分布百分比图
draw_hist(data_normalized, 'data_normalized')
plt.tight_layout()
plt.show()
效果:
mask(四维数组6通道:N, 256, 256, 6)
# mask (四维数组6通道:N, 256, 256, 6)
path_mask = "/home/linxq/dataset/cell/pannuke/Fold 3/masks/fold3/masks.npy"
# 从.npy文件中加载数据
data_mask = np.load(path_mask)
print(data_mask.shape)
# 选择要展示的图像数量
num_images_to_show = 5
# 从data中随机选择五个样本
random_indices = np.random.choice(data_mask.shape[0], num_images_to_show, replace=False)
# 创建子图
fig, axes = plt.subplots(num_images_to_show, 6, figsize=(15, 3*num_images_to_show))
# 展示随机选择的图像
for i, idx in enumerate(random_indices):
for j in range(6):
axes[i, j].imshow(data_mask[idx, :, :, j])
axes[i, j].axis('off') # 关闭坐标轴
plt.tight_layout()
plt.show()
image+mask(多分类问题)
# image+mask
import numpy as np
import matplotlib.pyplot as plt
# 原始图像路径
path_image = "/home/linxq/dataset/cell/pannuke/Fold 3/images/fold3/images.npy"
# 从.npy文件中加载数据
data_image = np.load(path_image)
print("Image data shape:", data_image.shape)
# 图像数据归一化
data_image_normalized = data_image.astype('float32') / 255.0
# 掩膜图像路径
path_mask = "/home/linxq/dataset/cell/pannuke/Fold 3/masks/fold3/masks.npy"
# 从.npy文件中加载数据
data_mask = np.load(path_mask)
print("Mask data shape:", data_mask.shape)
# 选择要展示的图像数量
num_images_to_show = 3
# 从原始图像数据中随机选择五张图像
random_indices = np.random.choice(len(data_image_normalized), num_images_to_show, replace=False)
# 创建子图
fig, axes = plt.subplots(num_images_to_show, 7, figsize=(18, 3*num_images_to_show))
# 展示随机选择的图像和对应的掩膜图像
for i, idx in enumerate(random_indices):
# 展示原始图像
axes[i, 0].imshow(data_image_normalized[idx])
axes[i, 0].axis('off') # 关闭坐标轴
# 展示各个掩膜图像
for j in range(6):
axes[i, j + 1].imshow(data_mask[idx, :, :, j])
axes[i, j + 1].axis('off') # 关闭坐标轴
plt.tight_layout()
plt.show()