(数据分析三板斧)第一斧Numpy-第三节:索引和切片再练习
Posted 快乐江湖
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(数据分析三板斧)第一斧Numpy-第三节:索引和切片再练习相关的知识,希望对你有一定的参考价值。
文章目录
索引和切片是Numpy中的重点,其索引和切片非常灵活,结合上一节,这里只能再补充一些常用的方法,使用的好与不好还是在于自己的练习
一:索引和切片再谈
(1)多维数组的索引和切片
- 关于多维数组的索引和切片,其实在上一节中已有谈过,这里再补充一些内容
①:假设有一个三维数组,那么a[0][0][0]
的和a[0, 0, 0]
表达的意思一致
a = np.random.randint(0, 10, size=[3, 3, 3]) # 三维数组
print(a[0][0][0])
print(a[0, 0, 0])
②:如果希望选中的是列,可以这样写
a = np.random.randint(0, 10, size=[3, 3, 3]) # 三维数组
print(a)
print(a[0][:, 1])
③:下面是一个二维数组的切片练习
a = np.random.randint(0, 30, size=[6, 6]) # 三维数组
print(a)
print("-----------------------")
# 得到第一行的第4个和第5个元素
print(a[0][3:5])
print("-----------------------")
# 得到最后两行的最后两列
print(a[4:][:, -2:])
print("-----------------------")
# 取出第3,5行的奇数列
print(a[2:5:2][:, 1::2])
(2)切片是引用
切片在内存中使用的是引用机制
- 关于引用如果有不理解的,可以参照C++中的这一节2-5:C++快速入门之引用,引用和指针的区别
- 注意,这种现象不会出现在Python中的列表
如下,这就意味着Python并没有为b分配新的空间,而是让b指向了a的内存空间,那么改变b就会改变a
a = np.array([1, 2, 3, 4, 5])
b = a[0:3] # 切片操作
b[0] = 999 # 修改的是b
print(a) # 打印a
显而易见,Numpy这样设计的目的就是为了节省空间,但是这种机制缺陷也很大,容易把原来的值也修改了
为了解决这个问题,在Numpy中可以使用copy()
方法进行复制,这样它就会再开辟另外一个空间,独立于原来的空间
(3)花式索引
- 上节所讲到的索引和切片都比较中规中矩,无非就是
起始:终止:步长
这样的组合。在Numpy中还提供了很多灵活的索引方式
①:可以将列表传入,列表中的元素表示索引的位置
a = np.random.randint(0, 10, 10)
print(a)
print("------------------------------------")
index = [0, 1, 6] # 该列表指定了索引位置
b = a[index]
print(b)
②:还可以使用布尔数组进行索引
- 注意布尔数组长度必须和原数组长度相等
a = np.random.randint(0, 10, 10)
print(a)
print("------------------------------------")
mask = np.array(random.randint(0, 2, 10), dtype=bool) # 布尔类型数组
print(mask)
b = a[mask]
print(b)
③:二维进行索引时需要分别给出行和列的索引,比如下面返回的是一条次对角线上的5个元素的值
a = np.random.randint(0, 10, size=[6, 6])
print(a)
print("----------------------------------------------")
print(a[[0, 1, 2, 3, 4], [1, 2, 3, 4, 5]])
再比如,返回最后三行的第1、3、5列
a = np.random.randint(0, 10, size=[6, 6])
print(a)
print("----------------------------------------------")
print(a[-3:][:, [0, 2, 4]])
当然,布尔数组也是可以索引的
a = np.random.randint(0, 10, size=[6, 6])
mask = np.random.randint(0, 2, size=[6, 6], dtype=bool) # 布尔数组
print(a)
print(mask)
b = a[mask] # 索引
print("----------------------------------------------")
print(b)
二:WHERE语句
numpy.where()
函数会返回输入数组中满足给定条件的元素的索引,比如返回数组中所有大于10的元素的索引位置
a = np.random.randint(0, 10, size=[3, 3])
index = np.where(a > 5)
print(a)
print(index)
print(a[index])
以上是关于(数据分析三板斧)第一斧Numpy-第三节:索引和切片再练习的主要内容,如果未能解决你的问题,请参考以下文章
(数据分析三板斧)第一斧Numpy-第一节:Numpy基本了解
(数据分析三板斧)第一斧Numpy-第二节:生成数组数组属性和切片
(数据分析三板斧)第三斧Matplotlib-第三节:其他图形绘制