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