Python 迭代numpy数组时的性能问题
我有一个3D图像阵列,比如Python 迭代numpy数组时的性能问题,python,performance,loops,numpy,vectorization,Python,Performance,Loops,Numpy,Vectorization,我有一个3D图像阵列,比如 [ [ [225, 0, 0], [225, 225, 0], ... ], [ [225, 0, 0], [225, 225, 0], ... ], ... ] 此阵列的大小为500x500x3,其中750.000个元素。 这些是在数组上迭代的简单嵌套循环 arr中的行的: 对于行中的列: 对于列中的元素: 元素=(2*元素/最大颜色值)-1 但是迭代需要很多时间(>5分钟) 我是numpy新手,所以可能是我以错误的方式迭代数组?如何优化这些循环?Numpy数组
[
[
[225, 0, 0],
[225, 225, 0],
...
],
[
[225, 0, 0],
[225, 225, 0],
...
],
...
]
此阵列的大小为500x500x3,其中750.000个元素。
这些是在数组上迭代的简单嵌套循环
arr中的行的:
对于行中的列:
对于列中的元素:
元素=(2*元素/最大颜色值)-1
但是迭代需要很多时间(>5分钟)
我是numpy新手,所以可能是我以错误的方式迭代数组?如何优化这些循环?Numpy数组的设计目的不是对元素进行迭代。它甚至可能比在Python列表上迭代还要慢,因为这将导致大量元素的包装和展开 Numpy阵列设计用于批量处理。例如,计算两个1000×1000矩阵的元素和 如果要将所有元素与
2
相乘,将其除以MAX\u COLOR\u VAL
,然后从中减去一个元素,只需使用以下内容构造一个新数组:
arr = (2 * arr.astype(float) / MAX_COLOR_VAL) - 1
这将对所有元素应用此操作
注意:请注意,如果迭代一个numpy数组,则不会迭代索引,而是迭代行本身。因此,arr中行的中的行将返回一个2d数组,而不是2d数组的索引
您不应该迭代numpy数组。事实上,在numpy数组上迭代很可能比在Python列表上迭代要慢。numpy数组的思想是批量执行操作。您的程序甚至不会设置项目。我认为将数组强制转换为浮点(arr.astype(float)
)比仅执行类似于2.0*arr/MAX\u COLOR\u VAL)-1的操作要贵一些。为什么需要显式强制转换?@kmario23:当我使用timeit
运行这10000次时,.astype(float)
给出3.6568590000097174
,而2.0*…
给出3.6864939994127
。我认为这没多大关系。作为一名函数式程序员。我真的不喜欢这个float times int的想法,因为它让我想起了太多弱类型语言,比如C#。正如Python所说:“显式优于隐式”: