numpy 阅读无法装入内存的大型二进制文件并计算轴0上的平均值

ni65a41a  于 2023-05-29  发布在  其他
关注(0)|答案(1)|浏览(86)

我有一个非常大的binary文件。它的形状是(1000,20000,20000)。我需要计算np.nanmean(axis=0)
如何计算沿轴0的平均值?
我尽力了。

indata = np.memmap(file, mode='r', shape=(10000, 20000, 20000), dtype=np.float32)

它读起来是正确的。
然后,尝试nanmean计算:

result = np.nanmean(indata,axis=0)

它不适合内存,由于内存错误,shell被重新启动

qgelzfjb

qgelzfjb1#

让我们来看看保存和阅读Numpy数组的两种不同方式:

  • 作为无标题的二进制文件,以及
  • 作为.NPY文件,带有描述dtype和形状的标头
import numpy as np

# Create 100 element array of 8-byte floats
w, h = 10, 10          # width and height
a = np.arange(h*w, dtype=float).reshape((h,w))

现在,我们首先将该数组保存为纯的、无标题的二进制数据,然后保存为.NPY文件:

a.tofile('data.bin')
np.save('data.npy', a)

首先要注意的是data.bin正好是800字节,即每个8字节的100个浮点数。另一方面,data.npy是928字节,因为它有一个描述数组形状和dtype的头。
现在我们可以读取二进制文件,注意我们必须指定形状和dtype,因为没有头:

r = np.memmap('data.bin', float, shape=(h,w))
np.all(r==a)     # Check arrays are identical - prints True

现在我们可以读取.NPY文件,注意我们不需要指定形状和dtype,因为它在头文件中:

b = np.lib.format.open_memmap('data.npy')
np.all(b==a)     # Check arrays are identical - prints True

现在你可以计算你的平均值:

mean = np.nanmean(b, axis=0)

相关问题