11月13日numpy总结——花哨的索引
如果我们使用索引来取numpy对象里的数据时,通常是使用索引值或者切片:
aa = numpy.arange(16).reshape(4,4)
aa[2,3]
或者aa[:2,3:]
使用这些索引后的取值,通常是单个值,或者不能改变元素的相对位置,但是通过花哨的索引,我们可以按照我们指定的顺序进行取值。
aa = numpy.arange(10,20)
i = [2,5,3,1]
aa[i] 的结果为array([12, 15, 13, 11]),其是按照我们指定的索引顺序取出对应的元素。
利用花哨的索引,结果的形状与索引数组形状一致,而非与被索引数组形状一致。比如:
j = [[2,6],[4,9]]
aa[j]结果为:
array([[12, 16],
[14, 19]])
对于多维数组,也是一样的,比如:
import numpy as np
aa = np.arange(100).reshape(10,10)
j = [[2,6],[4,9]]
aa[j]结果为:
array([[[20, 21, 22, 23, 24, 25, 26, 27, 28, 29],
[60, 61, 62, 63, 64, 65, 66, 67, 68, 69]],
[[40, 41, 42, 43, 44, 45, 46, 47, 48, 49],[90, 91, 92, 93, 94, 95, 96, 97, 98, 99]]])
上述分别为第2行、第6行、第4行,第9行。
而如果,花哨索引是numpy对象,则会遵照numpy对象维度一一匹配的规则,。比如:
aa = np.arange(12).reshape(3,4)
row = np.array([0,1,2])
clo = np.array([1,2,3])
aa[row,clo]的结果为:array([ 1, 6, 11])
上述的三个值分别为aa[0,1]、aa[1,2]、aa[2,3]
如果维度不同,则会遵照广播规则,比如:
aa = np.arange(12).reshape(3,4)
row = np.array([0,1,2]).reshape(3,1)
clo = np.array([2,1,3])
aa[row,clo]的结果为:
array([[ 2, 1, 3],
[ 6, 5, 7],
[10, 9, 11]])
这是因为,按照广播规则,row会扩展为
[[0,0,0],
[1,1,1],
[2,2,2]]
clo会扩展为:
[[2,1,3],
[2,1,3],
[2,1,3]]
然后,row和clo一一匹配,就会成为
[[[0,2],[0,1],[0,3]],
[[1,2],[1,1],[1,3]],
[[2,2],[2,1],[2,3]]]
最后,按照花哨索引的形状,从aa中取对应的值。
