让我们深入了解一下 NumPy。NumPy 是 Python 中用于科学计算和数据分析的基础库之一。它提供了高效的多维数组对象 ndarray,以及许多用于数组计算、线性代数、傅里叶变换等方面的函数和工具。
安装 NumPy
首先,我们需要安装 NumPy 库。可以使用 pip 工具来完成安装:
pip install numpy
安装完成后,即可在 Python 脚本中导入 NumPy 库:import numpy as np
创建 ndarray
在 NumPy 中,最重要的数据结构是 ndarray(N-dimensional array)。ndarray 是一个多维数组对象,由相同类型的元素组成。以下是创建 ndarray 的几种常见方式。
使用 array() 函数创建
可以使用 array() 函数来创建一个 ndarray。该函数接受一个序列(例如列表或元组)作为输入,并返回一个新的包含指定序列数据的 ndarry 对象。
python import numpy as np a = np.array([1, 2, 3]) print(a) # 输出:[1 2 3]
array() 函数还可以接受一个 dtype 参数,用于指定返回的 ndarry 对象中元素的类型:
python import numpy as np a = np.array([1, 2, 3], dtype=float) print(a) # 输出:[1. 2. 3.]
使用 arange() 函数创建
arange() 函数类似于 Python 内置函数 range(),但它返回的是一个 ndarray 对象而不是列表。该函数接受三个参数:起始值(默认为0)、结束值(不包括)、步长(默认为1)。
python import numpy as np a = np.arange(0, 10, 2) print(a) # 输出:[0 2 4 6 8]
使用 linspace() 函数创建
linspace() 函数用于创建等间隔数列。该函数接受三个参数:起始值、结束值、元素个数。
python import numpy as np a = np.linspace(0, 10, num=5) print(a) # 输出:[0. 2.5 5. 7.5 10. ]
使用 zeros() 和 ones() 函数创建
zeros() 和 ones() 函数分别用于创建全零和全一矩阵。这两个函数都接受一个表示矩阵形状的元组作为输入参数。
python import numpy as np a = np.zeros((3,3)) print(a) # 输出: # [[0. 0. 0.] # [0. 0. 0.] # [0. 0. 0.]] b = np.ones((2,4)) print(b) # 输出: # [[1., 1., 1., 1.], # [1., 1., 1., 1.]] c = np.eye(3) print(c) # 输出: # [[1., 0., 0.], # [0., 1., 0.], # [0., 0., 1.]] d = np.diag([2,4,6]) print(d) # 输出: # [[2, 0, 0], # [0, 4, 0], # [0, 0, 6]]
数组属性与操作
在 NumPy 中,ndarray 具有许多属性和操作,下面介绍其中几个常见的属性和操作。
数组形状与大小
ndarray 对象有两个重要属性 shape 和 size 分别表示其形状和大小:
python import numpy as np a = np.array([[1,2],[3,4]]) print(a.shape) # 输出:(2,2) b = a.reshape((4,)) print(b.shape) # 输出:(4,)
size 属性表示数组中元素总数:
python import numpy as np a = np.array([[1,2],[3,4]])print(a.size) # 输出:12### 数组索引和切片与 Python 列表一样,ndarray 对象也可以通过索引和切片来访问其中的元素。但是,由于 ndarray 是多维数组对象,因此其索引和切片方式也有所不同。#### 索引对于一维数组,可以使用类似列表的方式来进行索引:
import numpy as npa = np.array([1, 2, 3])print(a[0]) # 输出:1
对于多维数组,则需要指定每个轴上的索引值:pythonimport numpy as npa = np.array([[1, 2], [3, 4]])print(a[0, 0]) # 输出:1#### 切片对于一维数组,切片方式与列表相同:pythonimport numpy as npa = np.array([1, 2, 3])print(a[:2]) # 输出:[1 2]对于多维数组,则需要在每个轴上指定要取得的范围:pythonimport numpy as npa = np.array([[1, 2], [3, 4], [5, 6]])print(a[:2,:1]) # 输出:# [[1]# [3]]### 数组运算在 NumPy 中,ndarray 对象支持基本的数学运算符(如 +、-、* 和 /)以及其他操作(如矩阵乘法)。这些运算符都是按元素执行的。pythonimport numpy as npa = np.array([1, 2, 3])b = np.array([4, 5, 6])c = a + b d = a * b e = a.dot(b)print(c) # 输出:[5 7 9]print(d) # 输出:[4 10 18]print(e) # 输出:32除了逐元素计算之外,NumPy 还提供了许多函数用于处理 ndarry 对象。例如 sum() 函数可用于计算所有元素的总和:pythonimport numpy as npa = np.array([1, 2, 3])b = a.sum()print(b) # 输出:6## 广播机制广播机制(broadcasting)是 NumPy 中一个非常强大的功能。它允许不同形状的数组进行数学运算而无需复制数据。简单地说,广播机制会自动扩展维度较小的数组,并将其重复以匹配另一个较大数组。例如,在以下示例中,我们将一个标量加到一个二维矩阵中:pythonimport numpy as npa = np.ones((3,3))b = a + 3 print(b)# 输出:# [[4. 4. 4.]# [4. 4. 4.]# [4. 4. 4.]]在这里,标量值被扩展为一个形状与 a 相同的二维矩阵,并且两个矩阵相加得到结果 b。## 线性代数运算NumPy 提供了许多用于线性代数计算的函数和工具。下面介绍几个常见的线性代数运算。### 点积(内积)点积是两个向量之间进行乘法运算并求和得到结果。在 NumPy 中可以使用 dot() 函数来计算点积。pythonimport numpy as npa = [1,2]b = [3,4]c = np.dot(a,b)print(c) # 输出:11
求逆矩阵、行列式和特征值等操作NumPy 还提供了许多其他线性代数相关的函数和工具,包括求逆矩阵、行列式、特征值等操作。这些函数都在 linalg 模块中。
import numpy as np
a = np.array([[1,2],[3,4]])
求逆矩阵
b = np.linalg.inv(a)print(b) # 输出:
[[-2. 1. ]
[ 1.5 -0.5]]
求行列式c = np.linalg.det(a)print©
输出:-2.0
求特征值和特征向量
d, e = np.linalg.eig(a)
print(d) # 输出:[-0.37228132 5.37228132]
print(e)