数据分析之道-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)切片是引用

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

如下,这就意味着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切片与索引的主要内容,如果未能解决你的问题,请参考以下文章

数据挖掘目录

Python数据分析之Numpy入门

pytorch张量数据索引切片与维度变换操作大全(非常全)

索引 切片 字符串数据类型

熊猫:切片多索引与许多索引

python基础复习-1-2 数据类型-strlisttupledict