如何加快部分numpy数组的迭代速度

Row*_*wan 5 python numpy

我有一个numpy的大型三维数组(比方说大小为100x100x100).我想迭代它的一部分很多次(大约70%的元素),我有一个大小相同的布尔矩阵,并定义元素是否应该完成操作.

我目前的方法是首先创建一个形状(N,3)的数组"coords",其中包含所有操作的坐标,然后

for i in np.arange(many_iterations):
    for j in coords:
        large_array[j] = do_something(large_array[tuple(j)])
Run Code Online (Sandbox Code Playgroud)

实际上,评估整个数组并在循环中包含一个额外的操作来测试布尔数组是否更好(请记住,事实评估然后是多次而不是一次).我的想法是,在这种情况下的回报将摆脱for循环

large_array = do_something(large_array if condition True)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如何使最后一行工作?

mds*_*ggs 3

首先创建一个布尔数组来定义您应该操作的位置,您可能会获得更好的性能:

big_3d_arr = some 100x100x100 array
where_to_operate_arr = big_3d_arr < 500 # or whatever your condition is
big_3d_arr[where_to_operate_arr] = do_something(big_3d_arr[where_to_operate_arr])
Run Code Online (Sandbox Code Playgroud)

类似的东西可能会起作用,但是您可能必须再次迭代并按块进行布尔索引,具体取决于您的应用程序。