numpy中的常用索引方式总结
numpy中的基本索引方式有三种:
1.切片索引
2.布尔索引
3.列表索引,也叫花式索引(fancy indexing)
这三种索引方式又可以混合使用,从而造就了numpy中丰富而又灵活的索引方式
import numpy as np
切片索引
切片索引和原生python中的列表切片基本上没有区别(并且也是左闭右开的),只是要注意一点:python中的切片得到的是独立于原列表的新对象,而numpy中的切片索引得到的是原对象的视图。
numpy中对ndarray数据类型进行索引的基本公式为ndarray[index,index,…]。其中第一个index表示对数组的第一维进行索引,第二个index表示对第二维进行索引,以此类推…这相当于在python中对列表进行list[][]…[]的操作
(多啰嗦一句,[]中的index数量可以不和ndarray的维数一致,但不能超过ndarray的维数,这是显然的)
exp = np.arange(30).reshape(3,2,5)
print(exp)
[[[ 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]]]
exp_index = exp[1,:,1:4]
print(exp_index)
[[11 12 13]
[16 17 18]]
exp_index[1] = 19
print(exp)
[[[ 0 1 2 3 4]
[ 5 6 7 8 9]]
[[10 11 12 13 14]
[15 19 19 19 19]]
[[20 21 22 23 24]
[25 26 27 28 29]]]
注意:exp已经发生了变化,充分说明了对ndarray进行切片索引得到的是视图而非副本。至于原因也很简单:numpy是为处理大数据而设计的,如果每次切片都需要复制一个新的对象,那么试想会对程序的运行效率和性能造成何等的压力?如果要得到原对象的副本可以使用ndarray.copy()方法。
布尔索引
借由一个判断表达式对原ndarray数组进行判断,可返回一个由布尔值组成的同型新ndarray对象。用这个布尔数组对原有ndarray对象进行筛选的过程就做布尔索引。
exp_1 = np.arange(12).reshape(3,4)
print(exp_1)
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
exp_bool = exp_1 < 7
print(exp_bool)
[[ True True True True]
[ True True True False]
[False False False False]]
注意:这时返回的是一个新的数组(显然是废话,数据类型都不一样了,但还是多说一句)
应用:使用布尔索引将exp数组中的前两行取出
(由于我不是写基础教程,用布尔数组筛选ndarray数组的原理就不详细写了。看不懂的童鞋可以把代码“拆开”后进行单步调试即可)
exp_bool_1 = exp_1[exp_1[:,0] <= 4]
print(exp_bool_1)
[[0 1 2 3]
[4 5 6 7]]
exp_bool_1[0] = 99
print(exp_bool_1)
print("----------------------------------")
print(exp_1)
[[99 99 99 99]
[ 4 5 6 7]]
----------------------------------
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
注意:经过布尔数组索引之后的数组是一个新的数组对象,而非原数组对象的视图。
列表索引
列表索引也就是用列表进行索引的一种索引方式。
exp_3 = np.arange(12).reshape(4,3)
print(exp_3)
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
exp_list = exp_3[[0,2,1]]
print(exp_list)
exp_list[0] = 111
print("------------------")
print(exp_3)
[[0 1 2]
[6 7 8]
[3 4 5]]
------------------
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
这种方式下的索引就是将原数组的下标放入一个列表中进行索引,会按顺序(按放入的下标顺序)返回一个新的数组对象。
当然,这三种方式也可以混合使用,但只要有一种方式是返回新对象的,那么整个的索引结果就是返回新对象的。
言不能悉意,关于索引方式,其实还有可讲之处,但再讲就显得冗长而啰嗦了,就此打住,没事看看书,有空多敲码。