簡體   English   中英

索引環繞的 numpy 二維數組

[英]Indexing numpy 2D array that wraps around

你如何索引一個在超出邊界時環繞的 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 左右的值都被返回,假設它環繞

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]]) 

這是您無需填充即可完成的操作。 這可以很容易地推廣到當您想要多個鄰居並且沒有填充數組的開銷時。

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, :]簡寫matrix[rows, :]這意味着給我選定的行,以及這些行的所有列。

然后接下來我們做[:, cols]這意味着給我所有的行和選定的 cols。

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]])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM