使用列表和数组的numpy数组索引

2024-06-30 08:22:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我有:

>>> 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)


Tags: ofnumpy列表istype数组array案例
2条回答

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,:]

In [166]: a[j]
Out[166]: array([1, 4])
In [167]: a[j,:]
Out[167]: 
array([[[1, 2],
        [3, 4]],

       [[1, 2],
        [3, 4]]])

(我经常包括尾随:,即使不需要它。这让我和读者都清楚地知道,我们在处理多少个维度。)

A1:l的结构与j不同。在

l只是一维,而{}是二维的。如果您更改其中一个:

# l = [0, 1]                                 # just one dimension!
l = [[0, 1], [0, 1]]                         # two dimensions
j = [np.array([0,1]), np.array([0, 1])]      # two dimensions

他们有同样的行为。在

A2:相同,案例2和案例3的数组结构不一样。在

相关问题 更多 >