如何使用批处理迭代地将 ndarray 写入 .npy 文件
How to write ndarray to .npy file iteratively with batches
我正在为机器学习应用程序生成大型数据集,它是一个形状为 (N,X,Y)
的 numpy 数组。这里N
是样本数,X
是一个样本的输入,Y
是一个样本的目标。我想以 .npy
格式保存这个数组。我有很多样本(N
非常大),所以最终的数据集大约有 10+ GB。这意味着我不能创建整个数据集然后保存它,因为它会淹没我的记忆。
是否可以将 n
批样本迭代写入此文件?因此,我想一次将 256 个样本的批次附加到文件中 ((256,X,Y)
)。
我发现可以使用 np.tofile and np.fromfile。请注意,下面的代码仍然假设您在内存中拥有整个数组,但您当然可以更改要动态生成的批次。
import numpy as np
N = 1000;
X = 10;
Y = 1;
my_data = np.random.random((N, X, Y));
print(my_data[700,:,:])
batch_size = 10;
with open('test.dat',mode='wb+') as f:
i = 0;
while i < N:
batch = my_data[i:i+batch_size,:,:]
batch.tofile(f)
i += batch_size;
x = np.fromfile('test.dat',dtype=my_data.dtype)
x = np.reshape(x, (N,X,Y))
print(x[700,:,:])
如@hpaulj 所述,无法使用 np.load
.
加载此文件
这是一个基于 numpy 实现 save
的解决方案,用于编写包含形状和类型信息的标准 npy
文件:
import numpy as np
import numpy.lib as npl
a = np.random.random((30, 3, 2))
a1 = a[:10]
a2 = a[10:]
filename = 'out.npy'
with open(filename, 'wb+') as f:
header = npl.format.header_data_from_array_1_0(a1)
npl.format.write_array_header_1_0(f, header)
a1.tofile(f)
a2.tofile(f)
f.seek(0)
header['shape'] = (len(a1) + len(a2), *header['shape'][1:])
npl.format.write_array_header_1_0(f, header)
assert (np.load(filename) == a).all()
这适用于 C_CONTIGUOUS
个没有 Python 个对象的数组。
我正在为机器学习应用程序生成大型数据集,它是一个形状为 (N,X,Y)
的 numpy 数组。这里N
是样本数,X
是一个样本的输入,Y
是一个样本的目标。我想以 .npy
格式保存这个数组。我有很多样本(N
非常大),所以最终的数据集大约有 10+ GB。这意味着我不能创建整个数据集然后保存它,因为它会淹没我的记忆。
是否可以将 n
批样本迭代写入此文件?因此,我想一次将 256 个样本的批次附加到文件中 ((256,X,Y)
)。
我发现可以使用 np.tofile and np.fromfile。请注意,下面的代码仍然假设您在内存中拥有整个数组,但您当然可以更改要动态生成的批次。
import numpy as np
N = 1000;
X = 10;
Y = 1;
my_data = np.random.random((N, X, Y));
print(my_data[700,:,:])
batch_size = 10;
with open('test.dat',mode='wb+') as f:
i = 0;
while i < N:
batch = my_data[i:i+batch_size,:,:]
batch.tofile(f)
i += batch_size;
x = np.fromfile('test.dat',dtype=my_data.dtype)
x = np.reshape(x, (N,X,Y))
print(x[700,:,:])
如@hpaulj 所述,无法使用 np.load
.
这是一个基于 numpy 实现 save
的解决方案,用于编写包含形状和类型信息的标准 npy
文件:
import numpy as np
import numpy.lib as npl
a = np.random.random((30, 3, 2))
a1 = a[:10]
a2 = a[10:]
filename = 'out.npy'
with open(filename, 'wb+') as f:
header = npl.format.header_data_from_array_1_0(a1)
npl.format.write_array_header_1_0(f, header)
a1.tofile(f)
a2.tofile(f)
f.seek(0)
header['shape'] = (len(a1) + len(a2), *header['shape'][1:])
npl.format.write_array_header_1_0(f, header)
assert (np.load(filename) == a).all()
这适用于 C_CONTIGUOUS
个没有 Python 个对象的数组。