【问题标题】:numpys fancy indexing pattern [duplicate]numpy花式索引模式[重复]
【发布时间】:2021-06-18 20:42:01
【问题描述】:

我正试图了解 numpy 的精美索引。 在尝试解决以下问题时,我目前无法解决问题:

给定以下 np.array t.

t = np.array([[6, 1, 8],
           [4, 3, 7],
           [9, 5, 2]])

我想使用精美的索引来实现以下模式

array([[8, 1, 8],
       [1, 8, 1],
       [8, 1, 8]])

我最接近的方法是

array([[8, 1, 8],
       [8, 1, 8],
       [8, 1, 8]])

使用t[:,[2,1,2]][[0,0,0]]

如何解决这些问题?

【问题讨论】:

  • 什么是“花式索引”?你的意思是 Python 的标准列表切片语法?因为如果是这样,网络上已经有大量关于如何使用它的解释器。当然,包括在 SO 上。例如。 stackoverflow.com/questions/509211/understanding-slice-notation
  • 感谢您的指出。在花哨的索引(与列表切片不同)中,将数组作为索引传递。
  • 花式索引绝对是一个 Python 数据科学术语(尽管很少使用)。简单的谷歌搜索会显示这一点。没必要啰嗦。这里有一个很好的阅读:jakevdp.github.io/PythonDataScienceHandbook/…@Mike'Pomax'Kamermans
  • 没有 sass,只是对一个我从未见过的不寻常术语感到困惑,尽管我曾多次使用 numpy。
  • @Mike'Pomax'Kamermans,该链接适用于 numpy,而不是基础 Python。 numpy.org/doc/stable/reference/… 使用名称高级索引。对于列表,只有 2 个选项 - 切片和单个索引。

标签: python numpy indexing


【解决方案1】:

我找到了两种解决问题的方法。

  1. 将具有相应点的索引映射到行和列坐标的二维数组。

    row = np.array([[0,0,0],[0,0,0],[0,0,0]])
    col = np.array([[2,1,2],[1,2,1],[2,1,2]])
    
    t[row,col]
    
    array([[8, 1, 8],
           [1, 8, 1],
           [8, 1, 8]])
    

与使用相同

t[  [[0,0,0],[0,0,0],[0,0,0]]  ,  [[2,1,2],[1,2,1],[2,1,2]]  ]
  1. 首先创建一个仅包含所需数字的一维数组,然后转换为一个二维数组,尽管这种方法会触发未来警告:不推荐使用非元组序列进行多维索引;使用arr[tuple(seq)] 而不是arr[seq]。将来这将被解释为数组索引arr[np.array(seq)],这将导致错误或不同的结果。

      t[0,[1,2]] [[  [[1,0,1],[0,1,0],[1,0,1]]  ]]
    
      array([[8, 1, 8],
             [1, 8, 1],
             [8, 1, 8]])
    

【讨论】:

  • 您的第一个解决方案也可以简化为t[0, col]
【解决方案2】:
In [198]: t = np.array([[6, 1, 8],
     ...:            [4, 3, 7],
     ...:            [9, 5, 2]])

看起来您想要获取 2 个元素,然后重复它们。

In [199]: t[0,[2,1]]                 # select the elements
Out[199]: array([8, 1])

然后利用 np.resize 如何“填充”更大的数组:

In [200]: np.resize(_,(3,3))
Out[200]: 
array([[8, 1, 8],
       [1, 8, 1],
       [8, 1, 8]])

这不是一个非常通用的解决方案,但是我不知道您如何想象将问题概括化

另一种扩展和重塑的方式

In [217]: np.repeat(t[[[0]],[2,1]],5,0).ravel()[:9].reshape(3,3)
Out[217]: 
array([[8, 1, 8],
       [1, 8, 1],
       [8, 1, 8]])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-01
    • 2021-10-24
    • 2012-03-14
    • 2017-12-28
    • 1970-01-01
    • 2016-04-28
    • 2012-02-03
    • 2017-08-09
    相关资源
    最近更新 更多