我试图理解numpy的组合切片和索引概念,但是我不确定如何正确地从numpy的输出中获得以下结果(手动以便我们可以理解numpy过程如何组合切片和索引,哪一个将是过程先?):
>>> import numpy as np
>>> a=np.arange(12).reshape(3,4)
>>> a
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> i=np.array([[0,1],[2,2]])
>>> a[i,:]
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[ 8, 9, 10, 11]]])
>>> j=np.array([[2,1],[3,3]])
>>> a[:,j]
array([[[ 2, 1],
[ 3, 3]],
[[ 6, 5],
[ 7, 7]],
[[10, 9],
[11, 11]]])
>>> aj=a[:,j]
>>> aj.shape
(3L, 2L, 2L)
我对aj的形状如何成为(3,2,2)以上输出感到有点困惑,任何详细的解释都非常感谢,谢谢!
答案 0 :(得分:1)
每当使用索引数组时,结果的形状与索引相同;例如:
>>> x = np.ones(5)
>>> i = np.array([[0, 1], [1, 0]])
>>> x[i]
array([[ 1., 1.],
[ 1., 1.]])
我们使用2x2数组编制索引,结果是2x2数组。 与切片组合时,切片的大小将保留。例如:
>>> x = np.ones((5, 3))
>>> x[i, :].shape
(2, 2, 3)
如果第一个示例是2x2项目数组,则此示例是2x2(长度为3)行的数组。
切换切片的顺序时也是如此:
>>> x = np.ones((5, 3))
>>> x[:, i].shape
(5, 2, 2)
这可以被认为是五个2x2阵列的列表。
请记住:当任何维度使用列表或数组建立索引时,结果的形状为 indices ,而不是输入的形状。
答案 1 :(得分:0)
a[:,j][0]
相当于a[0,j]
或[0, 1, 2, 3][j]
,它会为您提供[[2, 1], [3, 3]])
a[:,j][1]
相当于a[1,j]
或[4, 5, 6, 7][j]
,它会为您提供[[6, 5], [7, 7]])
a[:,j][2]
相当于a[2,j]
或[8, 9, 10, 11][j]
,它会为您提供[[10, 9], [11, 11]])