如何用掩码和索引替换双重for循环?

时间:2016-11-18 03:22:53

标签: python numpy multidimensional-array masked-array

我有几个嵌套的for循环做了正确的事情(数组的蒙版副本)。然而,性能太慢,我觉得必须有一个更好的Pythonic方法来做到这一点。目标是使用掩码来确定何时从源复制数据,使用coord作为源的索引。有效的循环代码如下:

import numpy as np
dest = np.zeros((4,4,2))
source = range(32)
source = np.reshape(source,(4,4,2))
mask = np.ones((4,4),bool)
mask[1,0] = 0
coord = np.ones((4,4,2),int)

for y in range (0,dest.shape[0]):
    for x in range (0, dest.shape[1]):
        if np.all(mask[y,x]):
            dest[y,x] = source[coord[y,x,0], coord[y,x,1]]

print dest

运行后,dest看起来像这样:

[[[ 10.  11.]
  [ 10.  11.]
  [ 10.  11.]
  [ 10.  11.]]
 [[  0.   0.]
  [ 10.  11.]
  [ 10.  11.]
  [ 10.  11.]]
 [[ 10.  11.]
  [ 10.  11.]
  [ 10.  11.]
  [ 10.  11.]]
 [[ 10.  11.]
  [ 10.  11.]
  [ 10.  11.]
  [ 10.  11.]]]

source[1,1]被复制到dest的所有内容,dest[1,0]除外,因为mask[1,0]设置为Falsemask的其余部分为True。任何人都可以告诉我如何用更高效的东西替换循环?

1 个答案:

答案 0 :(得分:3)

使用numpy.where。您必须为mask添加额外维度,以便它broadcast

dest = np.where(mask[:,:,None], source[coord[:,:,0], coord[:,:,1]], dest)

或者,如果适当的话:

dest = np.where(mask[:,:,None], source[coord[:,:,0], coord[:,:,1]], np.zeros((4,4,2)))