【问题标题】:Indexing numpy 2D array that wraps around索引环绕的numpy 2D数组
【发布时间】:2019-04-08 09:39:07
【问题描述】:

当一个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 附近的值都返回了,假设它环绕

【问题讨论】:

  • 看看 np.take
  • @hpaulj 类似this?

标签: python numpy indexing


【解决方案1】:

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

【讨论】:

    【解决方案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 个邻居,我可以在 row 和 col 列表中添加 2 个元素,分别为 -2 和 +2。我唯一有点困惑的是:对于矩阵[行] [:,列]。我认为它仅适用于 matrix[rows][cols] 但显然这不起作用。
    • 所以在 numpy 中,您可以使用 matrix[row, col] 而不是 pythons list[row][col] 来索引矩阵。所以这实际上是两个独立的索引a = matrix[rows]b = a[:, cols]: 意味着全部。
    • 嗯,这很有意义。谢谢你的解释
    • 每个 '[]` 都被单独评估(由 Python 解释器)。 matrix[rows] 完成,然后 [cols] 在结果上。所以你必须注意中间结果。在[rows, cols]numpy 中同时处理这两个部分。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 2019-12-23
      • 2022-07-08
      • 2012-11-07
      • 2022-01-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多