numpy-轴上的数组范围索引

时间:2018-07-06 15:10:43

标签: python numpy

例如,如果我有通过以下方式初始化的Numpy数组:

a = np.arange(12).reshape(6,2)
[out] array([[ 0,  1],
             [ 2,  3],
             [ 4,  5],
             [ 6,  7],
             [ 8,  9],
             [10, 11]])

mask = np.array([0, 2])

我的目标是按轴上的范围遮罩数组。像这样

for i in mask:
    target.append(a[i:i+3,:])

因此,应该是:

[out] array([[[0, 1],
              [2, 3],
              [4, 5]],

             [[4, 5],
              [6, 7],
              [8, 9]]])

但是效率低下。然后,我尝试了

a[mask:mask+3,:]

但它说

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: only integer scalar arrays can be converted to a scalar index

1 个答案:

答案 0 :(得分:2)

方法1

我们可以利用broadcasting生成所有索引和索引-

In [19]: a
Out[19]: 
array([[ 0,  1],
       [ 2,  3],
       [ 4,  5],
       [ 6,  7],
       [ 8,  9],
       [10, 11]])

In [21]: mask
Out[21]: array([0, 2])

In [24]: a[mask[:,None] + np.arange(3)]
Out[24]: 
array([[[0, 1],
        [2, 3],
        [4, 5]],

       [[4, 5],
        [6, 7],
        [8, 9]]])

方法2

我们还可以利用基于np.lib.stride_tricks.as_stridedscikit-image's view_as_windows获得更有效的解决方案-

In [43]: from skimage.util.shape import view_as_windows

In [44]: view_as_windows(a,(3,a.shape[1]))[mask][:,0]
Out[44]: 
array([[[0, 1],
        [2, 3],
        [4, 5]],

       [[4, 5],
        [6, 7],
        [8, 9]]])