我读一个供应商提供的大的二进制阵列成2D numpy的阵列tempfid的复杂重塑的执行效率(M,N)numpy的:阵列
# 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 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.vector操作并将其应用到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的计算,然后使用生成的数组在一行中创建副本? – 2011-03-24 16:26:55
@Winston Ewert:这是我可能失败的地方。我能够矢量化i,j,k的计算并创建vec_f1 = numpy.vectorize(lambda x:f1(x))并获得i_idx = vec_f1(idx)等等。但是,我无法想出一个数组的行操作:vec_assign = vectorize(lambda idx:newfid [***] = tempfid [***])给出错误,因为'lambda不能包含赋值' – DrSAR 2011-03-24 16:36:14
如果您使用的是Python 2.x,并且M很大,如果你打算循环,你应该考虑使用'xrange'而不是'range',就像一般规则一样。 – JoshAdel 2011-03-24 16:59:21