我想访问并使用巨大的numpy数组的列来做一些基本的东西,非稀疏,充满浮动,形状为200万x 800。 所以基本上:
a == b
但如果我创建一个包含800列的更大数组,则对列的访问时间非常高:
import numpy as np
a = np.ones(2000000) # 2 millions elts
%timeit np.log10(a)
10 loops, best of 3: 28.8 ms per loop
所以我的问题是:你如何处理这种情况?是否有更好的对象来存储这样一个大矩阵并执行简单的操作,如log10,情节等?或者我需要欺骗它,比如创建800 np.arrays的形状(2000000,)?我很快就读到了关于Pytables和hdf的帖子,但是我不知道这些解决方案是否适合我的问题,这看起来很简单......
非常感谢!
编辑:我的xp是64位,数组的dtype是float64。 我用几种形状测试了这个列的访问时间,并且出现了一些奇怪的事情:
a = np.ones((2000000, 800)) # take 12 Go RAM
b = a[:, 0].copy() # 6 mins
%timeit np.log10(b)
10 loops, best of 3: 31.4 ms per loop
和
a = np.ones((1000000, 800), dtype="float64")
%timeit np.log10(a[:, 0])
1 loops, best of 3: 150 ms per loop
对于大约1050000行的时间访问有一个阈值,所以我怀疑这个问题与64位机器上内存分配的最大位大小有关吗?