选择2D NumPy数组的“corner”元素

时间:2018-03-02 00:02:29

标签: python python-3.x numpy indexing

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

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 花式索引仅提供主对角线的末端:

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

Pseudo-2D 花式索引(第一行,然后是列式)提供正确的答案,但看起来很尴尬:

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

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

2 个答案:

答案 0 :(得分:3)

这有两种可能性。 (好吧,第一个人实际上并不喜欢):

>>> 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_知道如何执行此操作的详细信息。

答案 1 :(得分:1)

你可以这样做:

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