当在numpy中,使用整数索引,有个地方需要注意。
import numpy as np
nda = np.arange(36)
nda = nda.reshape(3,4,3)
数据是这样的:
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], [27, 28, 29], [30, 31, 32], [33, 34, 35]]])
如果我们执行:
nda[[0,1,2], [2,3,1]] 表示取 3 个分别坐标[0,2], [1,3], [2,1] 数据组成一个新的列表,结果为:
array([[ 6, 7, 8],
[21, 22, 23],
[27, 28, 29]])
再换一下,如果执行的是 nda[[0,1], [2,3], [1,2]],则表示从取个分别坐标为:[0,2,1], [1,3,2] 的数据组成一个新的列表,结果为:
array([ 7, 23])
就是说,如是对numpy的ndarray数组,直接使用整数数组索引的话,则每个索引数组是对应一个维度的索引值。这时每个索引数组相同位置的值组成了一个多维坐标索引(如果索引数组的位数不一致,则采用类似广播机制,采用上一个),就对应了数组中的一个具体的值(或是子数组)。也就是直接定位多维空间中的坐标位置上的数据。
如果我们的目的是希望做条件筛选,第一个维度的值 为 [0,1], 第二个维度的值为[2,3], 第三个维度的值为[1,2],而不是直接定位抓取,此里,需要采用 numpy.ix_ 方法
nda[np.ix_([0,1], [2,3], [1,2])],此时的结果是:
array([[[ 7, 8],
[10, 11]],
[[19, 20],
[22, 23]]])
保持相同的维度数,每个维度的数量根据索引数组进行了筛选。
所以,当采用整数数组进行索引时,一定想搞清楚,自己的目标是什么,确定要不要采用 numpy.ix_ 方法