(数据分析三板斧)第一斧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)切片是引用

切片在内存中使用的是引用机制

如下,这就意味着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-第三节:其他图形绘制

Numpy总结第三节:Numpy创建数组

(数据分析三板斧)第三斧Matplotlib-第一节:Matplotlib及其三层结构

大赛辅导第一章第三节:平台IDE策略编写