如何在没有 concat、stack 或 append 的情况下组合两个巨大的 numpy 数组?
How to combine two huge numpy arrays without concat, stack, or append?
我有两个巨大的 numpy 数组。每个数组的形状都是(7, 960000, 200)
。我想使用 np.concatenate((arr1, arr2), axis=1)
连接它们,以便最终形状为 (7, 1920000, 200)
。问题是,它们已经填满了我的 ram,而 ram 中没有足够的空间来进行连接操作,因此,执行被终止了。 np.stack
也一样。所以,我想做一个新的数组,依次指向两个数组,这个新数组应该和组合数组有同样的效果;它们也应该是连续的。
那么,怎么做呢?而且,有没有比我建议的想法更好的方法来组合它们?
Numpy numpy.memmap() 允许创建以二进制形式存储在磁盘上的内存映射数据,这些数据可以像单个数组一样进行访问和交互。此解决方案将您正在使用的各个数组保存为单独的 .npy 文件,然后将它们组合成一个二进制文件。
import numpy as np
import os
size = (7,960000,200)
# We are assuming arrays a and b share the same shape, if they do not
# see
# for an explanation on how to create the new shape
a = np.ones(size) # uses ~16 GB RAM
a = np.transpose(a, (1,0,2))
shape = a.shape
shape[0] *= 2
dtype = a.dtype
np.save('a.npy', a)
a = None # allows for data to be deallocated by garbage collector
b = np.ones(size) # uses ~16 GB RAM
b = np.transpose(b, (1,0,2))
np.save('b.npy', a)
b = None
# Once the size is know create memmap and write chunks
data_files = ['a.npy', 'b.npy']
merged = np.memmap('merged.dat', dtype=dtype, mode='w+', shape=shape)
i = 0
for file in data_files:
chunk = np.load(file, allow_pickle=True)
merged[i:i+len(chunk)] = chunk
i += len(chunk)
merged = np.transpose(merged, (1,0,2))
# Delete temporary numpy .npy files
os.remove('a.npy')
os.remove('b.npy')
- 基于:
- 另请查看 hdf5 and combining two hdf5 files here。这是另一种存储大型数据集的好方法
我有两个巨大的 numpy 数组。每个数组的形状都是(7, 960000, 200)
。我想使用 np.concatenate((arr1, arr2), axis=1)
连接它们,以便最终形状为 (7, 1920000, 200)
。问题是,它们已经填满了我的 ram,而 ram 中没有足够的空间来进行连接操作,因此,执行被终止了。 np.stack
也一样。所以,我想做一个新的数组,依次指向两个数组,这个新数组应该和组合数组有同样的效果;它们也应该是连续的。
那么,怎么做呢?而且,有没有比我建议的想法更好的方法来组合它们?
Numpy numpy.memmap() 允许创建以二进制形式存储在磁盘上的内存映射数据,这些数据可以像单个数组一样进行访问和交互。此解决方案将您正在使用的各个数组保存为单独的 .npy 文件,然后将它们组合成一个二进制文件。
import numpy as np
import os
size = (7,960000,200)
# We are assuming arrays a and b share the same shape, if they do not
# see
# for an explanation on how to create the new shape
a = np.ones(size) # uses ~16 GB RAM
a = np.transpose(a, (1,0,2))
shape = a.shape
shape[0] *= 2
dtype = a.dtype
np.save('a.npy', a)
a = None # allows for data to be deallocated by garbage collector
b = np.ones(size) # uses ~16 GB RAM
b = np.transpose(b, (1,0,2))
np.save('b.npy', a)
b = None
# Once the size is know create memmap and write chunks
data_files = ['a.npy', 'b.npy']
merged = np.memmap('merged.dat', dtype=dtype, mode='w+', shape=shape)
i = 0
for file in data_files:
chunk = np.load(file, allow_pickle=True)
merged[i:i+len(chunk)] = chunk
i += len(chunk)
merged = np.transpose(merged, (1,0,2))
# Delete temporary numpy .npy files
os.remove('a.npy')
os.remove('b.npy')
- 基于:
- 另请查看 hdf5 and combining two hdf5 files here。这是另一种存储大型数据集的好方法