【问题标题】:Select "corner" elements of a 2D NumPy array [duplicate]选择 2D NumPy 数组的“角”元素 [重复]
【发布时间】:2018-08-10 04:08:20
【问题描述】:

我正在尝试提取 NumPy 二维数组的四个角元素:

import numpy as np
data = np.arange(16).reshape((4, -1))
#array([[ 0,  1,  2,  3],
#       [ 4,  5,  6,  7],
#       [ 8,  9, 10, 11],
#       [12, 13, 14, 15]])

预期的输出是[[0,3],[12,15]] 或[0,3,12,15](随便)。真正的 2D fancy 索引只提供主对角线的末端:

data[[0,-1],[0,-1]]
#array([ 0, 15])

伪二维 fancy 索引(首先按行,然后按列)提供了正确的答案,但看起来很尴尬:

data[[0,-1]][:,[0,-1]]
#array([[ 0,  3],
#       [12, 15]])

有没有办法使用真正的fancy 索引,例如data[XXX,YYY],其中XXX 和YYY 是列表/数组/切片,来提取所有四个角?

【问题讨论】:

    标签: python python-3.x numpy indexing


    【解决方案1】:

    这里有两种可能性。 (好吧,第一个实际上并不花哨):

    >>> a = np.arange(9).reshape(3, 3)
    >>> 
    >>> m, n = a.shape
    >>> a[::m-1, ::n-1]                                                                                  
    array([[0, 2],                                                                                                      
           [6, 8]])                                                                                                     
    >>>                                                                                                                 
    >>> a[np.ix_((0,-1), (0,-1))]                                                   
    array([[0, 2],                                                                                                      
           [6, 8]])                                                                                                     
    

    更明确:

    >>> idx = np.ix_((0,-1), (0,-1))
    >>> idx
    (array([[ 0],
           [-1]]), array([[ 0, -1]]))
    >>> a[idx]
    array([[0, 2],
           [6, 8]])
    

    诀窍是利用指数广播。 np.ix_知道具体怎么做。

    【讨论】:

      【解决方案2】:

      你可以这样做:

      data[[0, 0, -1, -1], [0, -1, 0, -1]]
      

      【讨论】:

      • 或data[[0, 0, -1, -1], [0, -1, -1, 0]] 按顺时针顺序绕过拐角处。
      • @damores 你能解释一下这个逻辑吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-03
      • 2018-11-07
      • 1970-01-01
      • 2019-01-11
      • 1970-01-01
      • 2018-02-08
      相关资源
      最近更新 更多