索引环绕的numpy二维数组

时间:2018-11-05 02:10:14

标签: python numpy indexing

如何索引一个超出范围的环绕的numpy数组?

例如,我有3x3数组:

import numpy as np

matrix = np.array([[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15]])

## 
[[ 1  2  3  4  5]
 [ 6  7  8  9 10]
 [11 12 13 14 15]]

说我想为值15所在的索引(2,4)周围的值编制索引。我想用值返回数组:

[[9,  10, 6]
 [14, 15, 11]
 [4,  5,  1]]

基本上所有15左右的值都返回了,假设它回绕了

3 个答案:

答案 0 :(得分:5)

numpy数组中查找相邻元素的标准用法是arr[x-1:x+2, y-1:y+2]。但是,由于要换行,因此可以使用换行模式填充数组,并偏移xy坐标以解决此填充问题。

此答案假定您要与所需元素首次出现的邻居。


首先,找到您元素的索引,并考虑填充的偏移量:

x, y = np.unravel_index((m==15).argmax(), m.shape)
x += 1; y += 1

现在pad,并索引数组以获取邻居:

t = np.pad(m, 1, mode='wrap')    
out = t[x-1:x+2, y-1:y+2]  

array([[ 9, 10,  6],
       [14, 15, 11],
       [ 4,  5,  1]]) 

答案 1 :(得分:2)

这是无需填充即可完成的操作。这可以很容易地推广到您不仅仅需要一个邻居的情况下,而且没有填充数组的开销。

def get_wrapped(matrix, i, j):
  m, n = matrix.shape
  rows = [(i-1) % m, i, (i+1) % m]
  cols = [(j-1) % n, j, (j+1) % n]
  return matrix[rows][:, cols]

res = get_wrapped(matrix, 2, 4)

让我解释一下return matrix[rows][:, cols]发生了什么。这实际上是两个操作。

第一个是matrix[rows],它是matrix[rows, :]的简写,这意味着给我选定的行以及这些行的所有列。

接下来,我们要进行[:, cols],这意味着将所有行和选定的列都给我。

答案 2 :(得分:0)

take 函数就地工作。

>>> a = np.arange(1, 16).reshape(3,5)
array([[ 1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10],
       [11, 12, 13, 14, 15]])
>>> b = np.take(a, [3,4,5], axis=1, mode='wrap')
array([[ 4,  5,  1],
       [ 9, 10,  6],
       [14, 15, 11]])
>>> np.take(b, [1,2,3], mode='wrap', axis=0)
array([[ 9, 10,  6],
       [14, 15, 11],
       [ 4,  5,  1]])