切片对象时的高级整数切片是一个ndarray元组

时间:2018-01-11 12:58:11

标签: python numpy matrix multidimensional-array numpy-indexing

我明白了

x=np.array([[1, 2], [3, 4], [5, 6]] 
y = x[[0,1,2], [0,1,0]] 

输出给出y= [1 4 5]这只是将第一个列表作为行和秒列表和列。

但是下面的工作原理如何?

x = np.array([[ 0,  1,  2],[ 3,  4,  5],[ 6,  7,  8],[ 9, 10, 11]]) 

rows = np.array([[0,0],[3,3]])
cols = np.array([[0,2],[0,2]]) 
y = x[rows,cols] 

这给出了输出:

[[ 0  2]                                                                      
 [ 9 11]] 

使用ndarrays作为切片对象时,能解释一下逻辑吗?为什么行和列都有2d数组。当切片对象是ndarray而不是python列表时,规则有何不同?

3 个答案:

答案 0 :(得分:1)

围绕此问题的最简单方法是以下观察结果:输出的形状由索引数组的形状决定,或者更准确地说是将所有索引数组一起广播所形成的形状。

这样看:你有一个给定形状的数组A和另一个其他形状的数组V,你想要用{{1}的值填充A }}。你需要指定什么?好吧,对于V中的每个位置,您需要指定A中某个元素的坐标。因此,如果V是ND,则需要与V具有相同形状的N个索引数组,或者至少可以播放该数组。然后通过将这些索引数组放在A表达式中的坐标位置来索引V

答案 1 :(得分:1)

为了保持简单,我们会保持2D并假设rows.shape = cols.shape。 (你可以通过广播打破这个规则,但现在我们赢了)。我们将此形状称为(I, J)

然后y = x[rows, cols]与:

相同
y = np.empty((I, J))
for i in range(I):
    for j in range(J):
        y[i, j] = x[rows[i, j], cols[i, j]]

答案 2 :(得分:1)

我们有以下数组x

x = np.array([[1, 2], [3, 4], [5, 6]] 

索引[0, 1, 2][0, 1, 0]时索引为x

x[[0,1,2], [0,1,0]] 

给出

[1,  4,  5]

我们使用的指数基本上转化为:

[0, 1, 2] & [0, 1, 0] --> [0,0], [1,1], [2,0]

由于我们使用 1D list 作为索引,我们得到了1D数组。

有了这些知识,让我们看看下一个案例。现在,我们将数组x视为:

x = np.array([[ 0,  1,  2],[ 3,  4,  5],[ 6,  7,  8],[ 9, 10, 11]]) 

现在索引是2D数组。

rows = np.array([[0,0],[3,3]])
cols = np.array([[0,2],[0,2]]) 

当索引到数组x时,如:

x[rows,cols] 

简单地转换为:

[[0,0],[3,3]]
  | |   | |      ====> [[0,0]], [[0,2]], [[3,0]], [[3,2]]
[[0,2],[0,2]]

现在,很容易观察这些4 list of list在索引到数组x时如何产生以下结果(即此处它只返回角元素来自我们的数组x):

[[ 0,  2]                                                                      
 [ 9, 11]]

请注意,在这种情况下,我们将结果作为2D数组(与第一种情况下的1D数组相对),因为我们的索引rows& columns本身是2D数组(即等价list of list),而在第一种情况下,我们的索引是1D数组(或等效的简单list没有任何嵌套)。

因此,如果您需要2D数组作为结果,则需要将2D数组作为索引。