Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 迭代numpy数组时的性能问题_Python_Performance_Loops_Numpy_Vectorization - Fatal编程技术网

Python 迭代numpy数组时的性能问题

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数组

我有一个3D图像阵列,比如

[
[
[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所说:“显式优于隐式”: