【发布时间】:2011-07-22 06:52:26
【问题描述】:
我正在将供应商提供的大型二进制数组读入 2D numpy 数组 tempfid(M, N)
# load data
data=numpy.fromfile(file=dirname+'/fid', dtype=numpy.dtype('i4'))
# convert to complex data
fid=data[::2]+1j*data[1::2]
tempfid=fid.reshape(I*J*K, N)
然后我需要使用索引的非平凡映射将其重塑为 4D 数组有用 4d(N,I,J,K)。我按照以下几行使用 for 循环来执行此操作:
for idx in range(M):
i=f1(idx) # f1, f2, and f3 are functions involving / and % as well as some lookups
j=f2(idx)
k=f3(idx)
newfid[:,i,j,k] = tempfid[idx,:] #SLOW! CAN WE IMPROVE THIS?
转换为复数需要 33% 的时间,而复制这些切片 M 个切片需要剩余的 66%。无论我是在循环中一一执行此操作,还是通过 numpy.vectorizing 操作并将其应用于 arange(M),计算索引都很快。
有没有办法加快速度?任何有关更有效的切片、复制(或不复制)等方面的帮助表示赞赏。
编辑: 正如对问题"What's the fastest way to convert an interleaved NumPy integer array to complex64?" 的回答所了解的那样,如果改用视图,则可以将转换为复杂的速度提高 6 倍:
fid = data.astype(numpy.float32).view(numpy.complex64)
【问题讨论】:
-
您是否尝试过矢量化 i,j,k 的计算,然后使用生成的数组在一行中制作副本?
-
@Winston Ewert:这就是我可能失败的地方。我能够向量化 i,j,k 的计算并创建 vec_f1=numpy.vectorize(lambda x: f1(x)) 并获得 i_idx=vec_f1(idx) 等 - 但是,我想不出一个数组的 -line 操作:vec_assign=vectorize(lambda idx:newfid[ *** ]=tempfid[***]) 给出错误,因为 'lambda 不能包含赋值'
-
另外,如果您使用的是 Python 2.x,并且 M 很大,那么您应该考虑使用
xrange而不是range,如果您要进行循环,就像一般规则一样。
标签: python multidimensional-array numpy slice