如何索引一个超出范围的环绕的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左右的值都返回了,假设它回绕了
答案 0 :(得分:5)
在numpy
数组中查找相邻元素的标准用法是arr[x-1:x+2, y-1:y+2]
。但是,由于要换行,因此可以使用换行模式填充数组,并偏移x
和y
坐标以解决此填充问题。
此答案假定您要与所需元素首次出现的邻居。
首先,找到您元素的索引,并考虑填充的偏移量:
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]])