我讀一個供應商提供的大的二進制陣列成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