numpy数组索引与列表和数组

Ank*_*wal 7 python arrays numpy

我有:

>>> 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])])
Run Code Online (Sandbox Code Playgroud)

当我做

>>> a[l] # Case 1, l is a list of scalers
Run Code Online (Sandbox Code Playgroud)

我明白了

array([[1, 2],
       [3, 4]])
Run Code Online (Sandbox Code Playgroud)

这意味着索引只发生在第0轴上.

但是,当我这样做

>>> a[j] # Case 2, j is a list of numpy arrays
Run Code Online (Sandbox Code Playgroud)

我明白了

array([1, 4])
Run Code Online (Sandbox Code Playgroud)

这意味着沿轴0和轴1发生索引.

Q1:当用于索引时,为什么缩放器列表和numpy数组列表的处理存在差异?(案例1与案例2).在案例2中,我希望看到索引只发生在轴0和get

array( [[[1,2],
          [3,4]], 

        [[1,2],
         [3,4]]])
Run Code Online (Sandbox Code Playgroud)

现在,当使用numpy数组的数组时

>>> j1 = np.array(j) # numpy array of arrays
Run Code Online (Sandbox Code Playgroud)

下面的结果表明索引只发生在轴0上(如预期的那样)

>>> a[j1] Case 3, j1 is a numpy array of numpy arrays
array([[[1, 2],
        [3, 4]],

       [[1, 2],
        [3, 4]]])
Run Code Online (Sandbox Code Playgroud)

Q2:当用于索引时,为什么numpy数组列表和numpy数组numpy数组的处理存在差异?(案例2与案例3)

hpa*_*ulj 2

Case1,a[l]实际上是a[(l,)]扩展到a[(l, slice(None))]. 也就是说,使用 listl和自动尾随:切片对第一个维度进行索引。索引作为元组传递到数组__getitem__,并且()可以添加额外的索引而不会造成混淆。

Case2,a[j]被视为a[array([0, 1]), array([0, 1]]a[(array(([0, 1]), array([0, 1])]。换句话说,作为索引对象的元组,每个维度一个。它最终返回a[0,0]a[1,1]

Case3a[j1]a[(j1, slice(None))]将索引应用于j1第一个维度。

Case2 有点反常。您的直觉是有效的,但由于历史原因,这个数组列表(或列表列表)被解释为数组元组。

这已经在其他 SO 问题中讨论过,我认为它已记录在案。但我无法立即找到这些参考资料。

因此,使用索引对象元组或数组更安全。使用列表建立索引可能会产生歧义。


numpy 数组索引:列表索引和 np.array 索引给出不同的结果

这个 SO 问题涉及同一个问题,尽管对正在发生的事情的最清晰的陈述隐藏在 @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]]])
Run Code Online (Sandbox Code Playgroud)

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