一、前言
Python是一种高级编程语言,由Guido van Rossum于1991年创建。它以简洁、易读的语法而闻名,并且具有强大的功能和广泛的应用领域。Python具有丰富的标准库和第三方库,可以用于开发各种类型的应用程序,包括Web开发、数据分析、人工智能、科学计算、自动化脚本等。
Python本身是一种伟大的通用编程语言,在一些流行的库(numpy,scipy,matplotlib)的帮助下,成为了科学计算的强大环境。本系列将介绍Python编程语言和使用Python进行科学计算的方法,主要包含以下内容:
- Python:基本数据类型、容器(列表、元组、集合、字典)、函数、类
- Numpy:数组创建、数组操作、数组数学、广播
- Matplotlib:绘图风格和类型、图表自定义、多子图和布局
- IPython:创建笔记本、典型工作流程
二、实验环境
matplotlib | 3.5.3 | |
---|---|---|
numpy | 1.21.6 | |
python | 3.7.16 |
- 运行下述命令检查Python版本
python --version
- 运行下述代码检查Python、NumPy、Matplotlib版本
import sys
import numpy as np
import matplotlib
print("Python 版本:", sys.version)
print("NumPy 版本:", np.__version__)
print("matplotlib 版本:", matplotlib.__version__)
三、NumPy
NumPy(Numerical Python)是一个用于科学计算的Python库。它提供了一个强大的多维数组对象(ndarray),用于进行高效的数值运算和数据处理。Numpy的主要功能包括:
- 多维数组:Numpy的核心是ndarray对象,它是一个多维数组,可以存储同类型的元素。这使得Numpy非常适合处理向量、矩阵和其他多维数据结构。
- 数学函数:Numpy提供了许多常用的数学函数,如三角函数、指数函数、对数函数等。这些函数可以直接应用于整个数组,而无需编写循环。
- 广播(Broadcasting):Numpy支持不同形状的数组之间的运算,通过广播机制,可以对形状不同的数组进行逐元素的操作,而无需显式地编写循环。
- 线性代数运算:Numpy提供了丰富的线性代数运算函数,如矩阵乘法、求解线性方程组、特征值计算等。
- 随机数生成:Numpy包含了用于生成各种概率分布的随机数的函数,如均匀分布、正态分布、泊松分布等。
- 数据操作:Numpy提供了很多用于操作数组的函数,如切片、索引、排序、去重等。
Numpy广泛应用于科学计算、数据分析、机器学习等领域。它的高效性和便捷性使得它成为Python数据科学生态系统中不可或缺的组成部分。
0、多维数组对象(ndarray)
NumPy的ndarray
对象是NumPy库中最重要的对象之一,也是进行科学计算的核心数据结构。ndarray
代表了一个多维的数组,可以存储相同类型的元素。
多维数组的属性
ndarray.shape
:返回表示数组形状的元组,例如(2, 3)
表示2行3列的数组。ndarray.dtype
:返回数组中元素的数据类型,例如int
、float
、bool
等。ndarray.ndim
:返回数组的维度数,例如1表示一维数组,2表示二维数组。
1、创建数组
【深度学习】 Python 和 NumPy 系列教程(九):NumPy详解:1、创建数组的n种方式_QomolangmaH的博客-CSDN博客https://blog.csdn.net/m0_63834988/article/details/132782221?spm=1001.2014.3001.5501
https://blog.csdn.net/m0_63834988/article/details/132782221?spm=1001.2014.3001.5501
2、数组操作
【深度学习】 Python 和 NumPy 系列教程(十):NumPy详解:2、数组操作(索引和切片、形状操作、转置操作、拼接操作)_QomolangmaH的博客-CSDN博客https://blog.csdn.net/m0_63834988/article/details/132830547?spm=1001.2014.3001.5501
https://blog.csdn.net/m0_63834988/article/details/132830547?spm=1001.2014.3001.5501
3、数组数学
【深度学习】 Python 和 NumPy 系列教程(十一):NumPy详解:3、数组数学(元素、数组、矩阵级别的各种运算)_QomolangmaH的博客-CSDN博客
https://blog.csdn.net/m0_63834988/article/details/132863360?spm=1001.2014.3001.5501
4、数组广播
NumPy广播(Broadcast)是指在不同形状的数组之间进行运算的一种机制。它允许我们在不显式复制数据的情况下,对具有不同形状的数组进行逐元素的操作。广播可以使我们更方便地进行数组运算,提高代码的简洁性和效率。
在进行广播运算时,NumPy遵循一套严格的规则:
- 数组维度不同时,将维度较小的数组进行扩展,使其与维度较大的数组具有相同的维度数。
- 如果两个数组在某个维度上的形状相等,或其中一个数组在该维度上的形状为1,则认为它们在该维度上是兼容的。
- 如果两个数组在所有维度上都是兼容的,它们可以一起进行广播。
- 在广播中,沿着形状中为1的维度进行复制,以使两个数组具有相同的形状。
广播的过程是自动进行的,无需显式编写循环或复制数据。让我们通过一个具体的示例来说明广播的工作原理:
代码语言:javascript复制import numpy as np
# 创建两个数组
a = np.array([1, 2, 3])
b = np.array([[4, 5, 6], [7, 8, 9]])
# 进行广播运算
c = a b
print(c)
在这个例子中,数组a
的形状是(3,)
,数组b
的形状是(2, 3)
。根据广播的规则,a
的形状会被扩展为(2, 3)
,然后两个数组逐元素相加,得到结果数组c
。输出结果如下:
[[ 5 7 9]
[ 8 10 12]]
通过广播,我们可以在不改变数组形状的情况下,对不同形状的数组进行逐元素的操作。这使得我们可以更灵活地处理数据,并编写更简洁的代码。需要注意的是,虽然广播可以方便地进行数组运算,但在某些情况下可能会引起歧义或错误的结果。因此,在使用广播时,建议仔细理解广播规则,并确保操作的正确性。
5、排序操作
1. np.sort()
函数
该函数返回一个数组的排序副本
代码语言:javascript复制import numpy as np
a = np.array([3, 1, 4, 2, 5])
# 对数组进行排序
b = np.sort(a)
print(b)
# 输出: [1 2 3 4 5]
2. np.argsort()
函数
该函数返回数组排序后的索引。
代码语言:javascript复制import numpy as np
a = np.array([3, 1, 4, 2, 5])
# 返回排序后的索引
indices = np.argsort(a)
print(indices)
# 输出: [1 3 0 2 4]
3. ndarray.sort()
方法
该方法原地对数组进行排序,不返回副本。
代码语言:javascript复制import numpy as np
a = np.array([3, 1, 4, 2, 5])
# 原地对数组进行排序
a.sort()
print(a)
# 输出: [1 2 3 4 5]
4. 按列或行排序
可以指定 axis
参数来按列或行对二维数组进行排序。
import numpy as np
a = np.array([[3, 1, 4], [2, 5, 0]])
# 按列排序
b = np.sort(a, axis=0)
print(b)
# 输出:
# [[2 1 0]
# [3 5 4]]
# 按行排序
c = np.sort(a, axis=1)
print(c)
# 输出:
# [[1 3 4]
# [0 2 5]]
5. np.lexsort()
函数
该函数根据键的字典顺序对多个序列进行间接排序。
代码语言:javascript复制import numpy as np
a = np.array([[3, 1, 4], [2, 5, 0]])
names = np.array(['Tom', 'John'])
# 使用lexsort进行间接排序
indices = np.lexsort((names, a[:, 0]))
print(indices)
# 输出: [1 0]
sorted_data = a[indices]
print(sorted_data)
# 输出:
# [[2 5 0]
# [3 1 4]]
6. np.partition()
函数
该函数可以在数组中进行分区操作,将数组分割为满足指定条件的两个部分。分区后,左侧的元素都小于或等于右侧的元素,但它们之间的顺序是未定义的。
代码语言:javascript复制import numpy as np
a = np.array([3, 1, 4, 2, 5])
# 对数组进行分区
b = np.partition(a, 2)
print(b)
# 输出: [1 2 3 4 5]
7. np.argpartition()
函数
该函数返回分区操作后的索引
代码语言:javascript复制import numpy as np
a = np.array([3, 1, 4, 2, 5])
# 返回分区后的索引
indices = np.argpartition(a, 2)
print(indices)
# 输出: [1 3 0 2 4]
8. ndarray.argsort()
方法
该方法返回数组排序后的索引,类似于 np.argsort()
函数。
import numpy as np
a = np.array([3, 1, 4, 2, 5])
# 返回排序后的索引
indices = a.argsort()
print(indices)
# 输出: [1 3 0 2 4]
9. np.searchsorted()
函数
该函数用于在已排序的数组中查找指定元素应该插入的位置,以9.保持排序顺序。
代码语言:javascript复制import numpy as np
a = np.array([1, 3, 4, 4, 6])
# 查找元素应该插入的位置
index = np.searchsorted(a, 5)
print(index)
# 输出: 4