我明白了
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列表时,规则有何不同?
答案 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数组作为索引。