【发布时间】:2017-08-19 07:53:34
【问题描述】:
如果我需要知道索引,循环 3d numpy 数组的最快方法是什么。
... some sort of loop ...
do something with each element that requires a knowledge of i,j,k.
例如
for i in range(N):
for j in range(N):
for k in range(N):
index = # something that depends on i,j,k
B[index] = A[i][j][k]**2
实际的循环如下所示:
for z in range(Ngrid):
kz = 2*pi/LMAX*(z - Ngrid/2)
for y in range(Ngrid):
ky = 2*pi/LMAX*(y - Ngrid/2)
for x in range(Ngrid):
kx = 2*pi/LMAX*(x - Ngrid/2)
kk = sqrt(kx**2 + ky**2 + kz**2)
bind = int((kk - kmin)/dk)
if bind >= Nk:
continue
delk = delta_k[x][y][z]
Pk[bind] += (delk.real**2 + delk.imag**2)/2
Numk[bind] += 1
【问题讨论】:
-
方法没有太大区别,如果你必须循环的话。最好的方法是根本不循环。我会使用
A[i,j,k]索引,如果不是速度的话,为了清楚起见。你能为i,j,k'一次'的所有组合构造index吗? -
我有点怀疑你的
index(i, j, k)是另一种存储元素的布局 - Fortran 顺序与 C 顺序/行主要与列主要等......如果是这样的话,有比遍历所有数组更好的方法。 -
我不认为我可以一次构建索引。我编辑了帖子,它现在有了实际的循环。
-
你可以作为一个单一的班轮做到这一点:
[do_something for i in range(N) for j in range(N) for k in range(N)],也许这会更快。 -
我不确定这是否是禁食,但nditer 可能对你有帮助。
标签: python performance numpy