数据分析之道-NumPynumpy切片与索引
Posted i阿极
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据分析之道-NumPynumpy切片与索引相关的知识,希望对你有一定的参考价值。
文章目录
专栏导读
✍ 作者简介:i阿极,CSDN Python领域新星创作者,专注于分享python领域知识。
✍ 本文录入于《数据分析之道》,本专栏针对大学生、初级数据分析工程师精心打造,对python基础知识点逐一击破,不断学习,提升自我。
✍ 订阅后,可以阅读《数据分析之道》中全部文章内容,包含python基础语法、数据结构和文件操作,科学计算,实现文件内容操作,实现数据可视化等等。
✍ 还可以订阅进阶篇《数据分析之术》,其包含数据分析方法论、数据挖掘算法原理、业务分析实战。
✍ 其他专栏:《数据分析案例》 ,《机器学习案例》
1、前言
在NumPy中,切片和索引是常用的操作,可以用于获取数组中的部分数据或单个数据。下面我们将分别介绍NumPy中的切片和索引。
2、NumPy数组切片
2.1一维数组切片
切片是指获取数组的部分数据。在NumPy中,可以使用切片符号:来指定切片范围。
下面是一个简单的例子:
import numpy as np
a = np.array([1, 2, 3, 4, 5])
print(a[1:3])
这个例子中,我们创建了一个包含5个元素的一维数组,并使用a[1:3]来获取索引为1和2的元素。切片结果为[2, 3]。
2.2多维数组切片
除了一维数组,切片也可以用于多维数组。
例如:
import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(a[0:2, 1:3])
在这个例子中,我们创建了一个3x3的二维数组,并使用a[0:2, 1:3]来获取第1行至第2行(不包含第3行)和第2列至第3列(不包含第4列)的元素。切片结果为[[2, 3], [5, 6]]。
3、NumPy数组索引
索引是指获取数组中单个元素的值。在NumPy中,可以使用方括号[]和索引号来获取数组中的元素。
3.1一维数组索引
对于一维数组,可以使用一个整数来索引;对于多维数组,需要使用一个元组来索引。
下面是一个简单的例子:
import numpy as np
a = np.array([1, 2, 3, 4, 5])
print(a[3])
这个例子中,我们创建了一个包含5个元素的一维数组,并使用a[3]来获取索引为3的元素。索引结果为4。
3.2多维数组索引
对于多维数组,可以使用一个元组来索引。
例如:
import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(a[1, 2])
在这个例子中,我们创建了一个3x3的二维数组,并使用a[1, 2]来获取第2行、第3列(从0开始计数)的元素。索引结果为6。
4、NumPy数组高级索引
4.1整数数组索引
整数数组索引是指使用整数数组来获取数组的部分数据。在NumPy中,可以使用一个整数数组来获取一维数组的部分数据,或者使用两个整数数组来获取二维数组的部分数据。
下面是一个简单的例子:
import numpy as np
a = np.array([1, 2, 3, 4, 5])
print(a[[0, 2, 4]])
这个例子中,我们创建了一个包含5个元素的一维数组,并使用[0, 2, 4]来获取索引为0、2、4的元素。结果为[1, 3, 5]。
对于二维数组,可以使用两个整数数组来获取部分数据。
例如:
import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(a[[0, 2], [1, 2]])
在这个例子中,我们创建了一个3x3的二维数组,并使用[0, 2]和[1, 2]来获取第1行第2列和第3行第3列的元素。结果为[2, 9]。
4.2布尔数组索引
布尔数组索引是指使用布尔数组来获取数组的部分数据。在NumPy中,可以使用一个布尔数组来获取一维数组的部分数据,或者使用两个布尔数组来获取二维数组的部分数据。
下面是一个简单的例子:
import numpy as np
a = np.array([1, 2, 3, 4, 5])
b = np.array([True, False, True, False, True])
print(a[b])
这个例子中,我们创建了一个包含5个元素的一维数组,并使用[True, False, True, False, True]来获取数组中所有为True的元素。结果为[1, 3, 5]。
对于二维数组,可以使用两个布尔数组来获取部分数据。
例如:
import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
b = np.array([True, False, True])
c = np.array([False, True, True])
print(a[b, c])
在这个例子中,我们创建了一个3x3的二维数组,并使用[True, False, True]和[False, True, True]来获取第1行第3列和第2行第3列的元素。结果为[3, 6, 9]。
4.3数组索引
数组索引是指使用一个数组来获取数组的部分数据。在NumPy中,可以使用一个数组来获取一维数组的部分数据,或者使用两个数组来获取二维数组的部分数据。
下面是一个简单的例子:
import numpy as np
a = np.array([1, 2, 3, 4, 5])
b = np.array([0, 2, 4])
print(a[b])
这个例子中,我们创建了一个包含5个元素的一维数组,并使用[0, 2, 4]数组来获取索引为0、2、4的元素。结果为[1, 3, 5]。
对于二维数组,可以使用两个数组来获取部分数据。
例如:
import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
b = np.array([0, 2])
c = np.array([1, 2])
print(a[b, c])
在这个例子中,我们创建了一个3x3的二维数组,并使用[0, 2]和[1, 2]数组来获取第1行第2列和第3行第3列的元素。结果为[2, 9]。
总结
总的来说,切片和索引是NumPy中常用的操作,可以用于获取数组中的部分数据或单个数据。切片和索引都可以用于一维数组和多维数组,但在多维数组中需要使用元组来指定索引。
📢文章下方有交流学习区!一起学习进步!💪💪💪
📢首发CSDN博客,创作不易,如果觉得文章不错,可以点赞👍收藏📁评论📒
📢你的支持和鼓励是我创作的动力❗❗❗
(数据分析三板斧)第一斧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])
以上是关于数据分析之道-NumPynumpy切片与索引的主要内容,如果未能解决你的问题,请参考以下文章