我有:
>>> a
array([[1, 2],
[3, 4]])
>>> type(l), l # list of scalers
(<type 'list'>, [0, 1])
>>> type(i), i # a numpy array
(<type 'numpy.ndarray'>, array([0, 1]))
>>> type(j), j # list of numpy arrays
(<type 'list'>, [array([0, 1]), array([0, 1])])
当我这么做的时候
^{pr2}$我明白了
array([[1, 2],
[3, 4]])
这意味着索引只发生在第0个轴上。在
但当我这么做的时候
>>> a[j] # Case 2, j is a list of numpy arrays
我明白了
array([1, 4])
这意味着索引发生在轴0和轴1上。在
问题1:当用于索引时,为什么在处理定标器列表和numpy数组列表时有区别?(案例1与案例2)。在案例2中,我希望看到索引只发生在轴0上
array( [[[1,2],
[3,4]],
[[1,2],
[3,4]]])
现在,当使用numpy数组代替
>>> j1 = np.array(j) # numpy array of arrays
以下结果表明索引仅沿轴0进行(如预期)
>>> a[j1] Case 3, j1 is a numpy array of numpy arrays
array([[[1, 2],
[3, 4]],
[[1, 2],
[3, 4]]])
问题2:当用于索引时,为什么对numpy数组的list和numpy数组的numpy数组的处理有区别?(案例2与案例3)
Case1,
a[l]
实际上是a[(l,)]
,它扩展为a[(l, slice(None))]
。也就是说,用列表l
和自动尾随的:
片索引第一个维度。索引以元组的形式传递给数组__getitem__
,并且可以不加混淆地添加额外的()
。在情况2,}。换句话说,作为索引对象的元组,每个维度一个。最后返回}。在
a[j]
被视为a[array([0, 1]), array([0, 1]]
或{a[0,0]
和{Case3,
a[j1]
是a[(j1, slice(None))]
,只对第一个维度应用j1
索引。在案例2有点反常。您的直觉是正确的,但是由于历史原因,这个数组列表(或列表列表列表)被解释为数组的元组。在
这已经在其他SO问题中讨论过了,我认为这是有记录的。但我现在找不到那些参考资料。在
因此,使用索引对象的元组或数组更安全。用列表编制索引有潜在的歧义。在
numpy array indexing: list index and np.array index give different result
这个问题涉及到了同一个问题,尽管对所发生的事情的最清晰的陈述隐藏在@user2357112的评论中的代码链接中。在
另一种强制Case3类索引的方法是显式地生成第二维度切片
a[j,:]
(我经常包括尾随
:
,即使不需要它。这让我和读者都清楚地知道,我们在处理多少个维度。)A1:
l
的结构与j
不同。在l
只是一维,而{他们有同样的行为。在
A2:相同,案例2和案例3的数组结构不一样。在
相关问题 更多 >
编程相关推荐