在numpy数组中访问聚焦单元周围的单元

时间:2018-11-02 04:49:09

标签: python numpy

我想在以下numpy数组中分别提取橙色和绿色的单元格:

enter image description here

我可以通过硬编码例如arr [0,1]指向左上方的网格单元。有没有办法更优雅地做到这一点?

2 个答案:

答案 0 :(得分:3)

假设您有一个名为N*N的{​​{1}}数组,则可以简单地执行以下操作:

a

提取第np.concatenate((a[k:-k:N-2*k-1,k:-k], a[k+1:-k-1,k:-k:N-2*k-1]), None) 轮(从零开始),其中第一个切片代表两行,第二个切片代表两列。

示例(对输出进行排序以便于验证)

k

它将输出:

N = 8
k = 1
a = np.arange(N * N).reshape(N, N)
print(a)
print(np.sort(np.concatenate((a[k:-k:N-2*k-1,k:-k], a[k+1:-k-1,k:-k:N-2*k-1]), None)))

答案 1 :(得分:1)

使用布尔mask数组:

arr = np.random.permutation(np.arange(25)).reshape(5,5)

>>> arr
array([[15,  9,  7,  1, 22],
   [16,  4,  2, 19, 13],
   [12,  3, 23,  8,  6],
   [ 0, 20, 21, 10, 14],
   [18,  5, 24, 11, 17]])

以上是为此目的建立一个随机矩阵。

# Build mask
mask = np.ones((5,5)) == True
mask[1:4, 1:4] = False

>>> mask
array([[ True,  True,  True,  True,  True],
   [ True, False, False, False,  True],
   [ True, False, False, False,  True],
   [ True, False, False, False,  True],
   [ True,  True,  True,  True,  True]])

# Extract values:
>>> arr[mask]
array([15,  9,  7,  1, 22, 16, 13, 12,  6,  0, 14, 18,  5, 24, 11, 17])

为内圆构建下一个蒙版:

mask = np.ones((5,5)) == False
mask[1:4, 1:4] = True
mask[2,2] = False

>>> mask
array([[False, False, False, False, False],
   [False,  True,  True,  True, False],
   [False,  True, False,  True, False],
   [False,  True,  True,  True, False],
   [False, False, False, False, False]])

arr[mask]
>>> array([ 0, 15, 20, 16,  4,  1,  6,  8])