用索引切割2D的numpy数组

6

如何根据索引公式“雕刻”或掩盖2D numpy数组?我不关心元素值,只关心在数组中的位置。

例如,给定一个mxm数组,如何提取所有地址符合以下条件的元素

for i in range(0,m):
    for j in range(0,m):
        if j-i-k>=0:
            A[i,j] = 1
        elif j-p-k>=0:
            A[i,j] = 1
        elif i-k>=0:
            A[i,j] = 1
        else:
            A[i,j] = 0
        j=j+1
    i=i+1

其中,

k和p是任意的围栏

假设

k<m
p<m

这最终看起来像是一个对角线切片 + 一个水平切片 + 一个垂直切片。是否可以在不使用上述for循环的情况下完成?

关于 new_data = data[mask] @tcaswell,我有进一步的问题。使用我的“for”创建的掩码“删除”了一些行和列,并且以某种方式使我得到了一个向量,而不是原始数据形状的数组。为什么会这样?我该如何避免这种情况? - Hokiexterra
3个回答

3
In [1]: import numpy as np

In [2]: k = 2

In [3]: i, j = np.ogrid[0:5,0:5]

In [4]: mask = (j-i-k < 0)

In [5]: mask
Out[5]: 
array([[ True,  True, False, False, False],
       [ True,  True,  True, False, False],
       [ True,  True,  True,  True, False],
       [ True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True]], dtype=bool)

In [6]: mask.shape
Out[6]: (5, 5)

In [7]: mask.dtype
Out[7]: dtype('bool')

1
xdim,ydim = data.shape
k = 2
a, b = np.meshgrid(range(ydim),range(xdim))
mask = (b - a -k) < 0

new_data = data[mask]

new_data2 = np.array(data) # to force a copy
new_data2[~mask] = 0

new_data 是一个向量,因为掩码处理(以这种方式完成)会使数组变平。您正在选择一个无法表示为数组的不规则形状。如果您只想将未选择的值设置为0,请使用 new_data2。


1
这是另一种使用{{link1:np.indices}}的方法:
>>> import numpy as np
>>> a = np.arange(90).reshape(10,9)
>>> b = np.indices(a.shape)
>>> k = 2
>>> i = b[1] - b[0] - k
>>> a[i < 0]
array([ 0,  1,  9, 10, 11, 18, 19, 20, 21, 27, 28, 29, 30, 31, 36, 37, 38,
   39, 40, 41, 45, 46, 47, 48, 49, 50, 51, 54, 55, 56, 57, 58, 59, 60,
   61, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
   79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接