Я читаю предоставленный поставщиком большой двоичный массив в двумерный массив с нулевой переменной 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).
Есть ли способ ускорить это?Любая помощь по более эффективному нарезке, копированию (или нет) и т. Д. Приветствуется.
РЕДАКТИРОВАТЬ: Как выяснилось в ответе на вопрос "Какой самый быстрый способ преобразовать чередованное число NumPyмассив в комплекс64? " преобразование в комплекс может быть ускорено в 6 раз, если вместо этого используется представление:
fid = data.astype(numpy.float32).view(numpy.complex64)