In [117]: arr4 = np.random.randn(2000,5)
In [118]: inds = np.random.permutation(2000)[:500] #随机取500个index
In [120]: %timeit arr4[inds] #使用花式索引
16.8 µs ± 38.9 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [121]: %timeit arr4.take([inds],axis=0) #take函数
6.73 µs ± 37.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [123]: arr4[inds] #二维数组
Out[123]:
array([[ 1.53280278, -0.2719217 , 0.42966353, -2.52355042, -0.0312035 ],
[ 0.11913129, 0.60892999, -1.62264713, -1.34378499, 0.25182348],
[-1.99468041, -0.21617321, -0.97631606, -1.10507143, 0.81055407],
...,
[ 0.32164417, 0.05819926, -0.50391144, -1.36189419, 0.67204582],
[ 1.34844867, -1.24891496, -1.10925116, -0.0671594 , -0.71582026],
[ 0.16707921, -0.22584386, -0.77064574, 0.72433377, 3.23800582]])
In [124]: arr4.take([inds],axis=0) #三维数组,可传入多个数组进行取值
Out[124]:
array([[[ 1.53280278, -0.2719217 , 0.42966353, -2.52355042,
-0.0312035 ],
[ 0.11913129, 0.60892999, -1.62264713, -1.34378499,
0.25182348],
[-1.99468041, -0.21617321, -0.97631606, -1.10507143,
0.81055407],
...,
[ 0.32164417, 0.05819926, -0.50391144, -1.36189419,
0.67204582],
[ 1.34844867, -1.24891496, -1.10925116, -0.0671594 ,
-0.71582026],
[ 0.16707921, -0.22584386, -0.77064574, 0.72433377,
3.23800582]]])
根据测试结果可看出,使用take函数比花式索引的性能要好很多,当设置单个轴向的选区时最好使用take函数而非花式索引。当需要同时选取或修改多个指定元素时,使用花式索引或put函数。