5

我在 numpy 中有一个大型 3 维数组(可以说大小为 100x100x100)。我想多次迭代它的一部分(大约 70% 的元素),我有一个大小相同的布尔矩阵,它定义了元素是否应该完成操作。

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

for i in np.arange(many_iterations):
    for j in coords:
        large_array[j] = do_something(large_array[tuple(j)])

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

large_array = do_something(large_array if condition True)

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

4

2 回答 2

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])

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

于 2013-05-16T16:22:17.020 回答
3

您基本上是在尝试重新创建masked arrays这个页面给出了很好的介绍。

于 2013-05-16T16:59:02.827 回答