索引符号为"[ ]",对于Numpy中的高维矩阵,只要按照剥洋葱的套路来,“[ ]"是下标索引,也就是说,对相应维度上元素的索引,其大小不超过该维度上元素个数减一。什么意思呢,举例来说。假设我有一个三维矩阵,那么我对该矩阵的索引”[ ]“中不能超过三个对象。第一个对象中取出一个数,作为矩阵第一维上的索引,第二个对象中取出一个数,作为第二维上的索引,以此类推。
>>> a=np.reshape(np.arange(27),(3,3,3))
# 创建了一个3维矩阵a
>>> a
array([[[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8]],
[[ 9, 10, 11],
[12, 13, 14],
[15, 16, 17]],
[[18, 19, 20],
[21, 22, 23],
[24, 25, 26]]])
>>> a[[1,0],[[1,0],[0,1]],1]
#对a的索引是三个对象,指明第一维索引的object是一个长度为2的列表,
#指明第二维索引的object是一个2维,第三个索引对象是一个整型数指明了第三维的索引
array([[13, 1],
[10, 4]])
>>> a[1,[1,0]]
array([[12, 13, 14],
[ 9, 10, 11]])
>>> a[[1,0],1]
array([[12, 13, 14],
[ 3, 4, 5]])
>>> a[1,[1,2],1]
array([13, 16])
>>>
再来解释下前面的说法。a矩阵在第一维上有三个元素(即三个2*2的矩阵),所以,第一个索引对象中的数大小不能超过(3-1=2)。因为矩阵a共有三个维度,所以方括号里不能超过三个对象。
怎么看矩阵的第几维有几个元素呢?很简单,对于第一维,你就看最外一层方括号”[]“里边出现了几个分隔的逗号,a中出现了2个逗号,那么这一维就有(2+1=3)个元素,对于第二维、第三维以同样的方法类推。
那么怎么看最好索引结果的形状呢?
这个也好理解。整体形状是受”[ ]“中维数高的对象约束,完整形状还要收实际索引的元素影响。
比如说,对于这个索引
a[[1,0],[[1,0],[0,1]],1]
它的第二维索引对象是一个2*2的矩阵形式。那么最后返回的结果就是一个以第二维对象形状维原型的矩阵
>>>a[1,[1,0]]
array([[12, 13, 14],
[ 9, 10, 11]])
再比如说这个索引,它的形状应该是一个长度维2的一维矩阵,里边的第一个元素是a[1,1],第二个元素是a[1,0]。a[1,1],a[1,0]是一个长度为三的一维矩阵,所以最后的结果就是一个二维的2*3矩阵矩阵。
>>>a[1,[1,0]]
array([[12, 13, 14],
[ 9, 10, 11]])
也就是说索引的对象的形状是最后结果的相应低维的形状。还是回到上面这个例子,索引的决定性形状是第一维长度为2,所以最后的结果的第一维长度为2.