_numpy中的常用索引方式总结

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]]

这种方式下的索引就是将原数组的下标放入一个列表中进行索引,会按顺序(按放入的下标顺序)返回一个新的数组对象。
当然,这三种方式也可以混合使用,但只要有一种方式是返回新对象的,那么整个的索引结果就是返回新对象的。

言不能悉意,关于索引方式,其实还有可讲之处,但再讲就显得冗长而啰嗦了,就此打住,没事看看书,有空多敲码。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值