【问题标题】:Index order in loop with numpy array带有numpy数组的循环中的索引顺序
【发布时间】:2015-11-11 00:26:54
【问题描述】:

是否有特定的顺序在一个 numpy 数组中创建多个循环以加快速度?我的意思是,让A 成为一个带有A = A(i,j,k) 的numpy 数组。

如果我必须创建循环,我应该按什么顺序执行 for 序列? 谢谢

【问题讨论】:

  • 如果你在 Python 中循环一个 NumPy 数组,你已经输了。
  • numpy 中快速的诀窍是通过使用numpy 的矢量化操作尽可能少地循环。如果您发布一些示例代码,人们可能会向您展示如何做到这一点。

标签: python arrays loops numpy


【解决方案1】:

您是循环遍历所有维度,还是仅循环一个?

for aa in A:
   print(aa)

迭代第一维

例如

In [479]: A=np.arange(12).reshape(3,4)
In [480]: A
Out[480]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
In [481]: for a in A:
   .....:     print(a)
   .....:     
[0 1 2 3]
[4 5 6 7]
[ 8  9 10 11]

您可以通过索引对其他维度进行迭代

In [482]: for j in range(4):
   .....:     print(A[:,j])
   .....:     
[0 4 8]
[1 5 9]
[ 2  6 10]

或转置:

In [483]: for a in A.T:
   .....:     print(a)
   .....:     
[0 4 8]
[1 5 9]
[ 2  6 10]
[ 3  7 11]

如果您遍历第一个维度而不是最后一个维度,则速度会略有优势。但我强调这是次要的。

最好完全避免循环,使用一次对整个数组进行操作的编译方法。相比之下,迭代要慢得多。

for i in range(A.shape[0]):
    for j in range(A.shape[1]):
        for k in range(A.shape[2]):
             A[i,j,k]

无论嵌套循环的顺序如何,都会非常慢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 2014-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-29
    相关资源
    最近更新 更多