Python – NumPy基础使用教程
文章目录
前言
NumPy(Numerical Python)是Python中用于科学计算的核心库之一。它提供了高性能的多维数组对象和用于处理这些数组的工具。NumPy是许多其他科学计算库的基础,如Pandas、SciPy、Matplotlib等。本文从NumPy的基础知识开始,逐步深入,介绍了NumPy数组的创建、索引与切片、数学运算、广播机制、线性代数运算、随机数生成、文件操作以及性能优化等内容。希望通过本文的学习,你能够掌握NumPy的核心功能,并能够在实际项目中灵活运用。
一、NumPy基础使用教程
1. NumPy简介
NumPy是一个开源的Python库,主要用于处理大型多维数组和矩阵。它提供了大量的数学函数来操作这些数组。NumPy的核心是ndarray
对象,这是一个n维数组对象,具有快速的数值计算能力。
2. 安装NumPy
在使用NumPy之前,需要先安装它。通过以下命令使用pip安装NumPy:
pip install numpy -i https://mirrors.aliyun.com/pypi/simple/
安装完成后,通过以下代码验证是否安装成功:
import numpy as np
print(np.__version__)
3. NumPy数组基础
NumPy的核心是ndarray
对象,它是一个多维数组对象。与Python的列表不同,NumPy数组中的元素必须是相同类型的,这使得NumPy数组在存储和操作上更加高效。
3.1 创建数组
可以通过多种方式创建NumPy数组,最简单的方式是使用np.array()
函数:
import numpy as np
# 创建一维数组
arr1 = np.array([1, 2, 3, 4, 5])
print(arr1)
# 创建二维数组
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
print(arr2)
打印结果如下所示:
[1 2 3 4 5]
[[1 2 3]
[4 5 6]]
3.2 数组的属性
NumPy数组有许多有用的属性,如shape
、dtype
、size
等:
import numpy as np
# 创建二维数组
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
print(arr2.shape) # 输出数组的形状
print(arr2.dtype) # 输出数组的数据类型
print(arr2.size) # 输出数组的元素总数
打印结果如下所示:
(2, 3)
int32
6
4. 数组的创建
除了使用np.array()
函数,NumPy还提供了许多其他创建数组的方法:
4.1 创建全零数组
import numpy as np
zeros_arr = np.zeros((3, 4)) # 创建一个3行4列的全零数组
print(zeros_arr)
打印结果如下所示:
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
4.2 创建全一数组
import numpy as np
ones_arr = np.ones((2, 3)) # 创建一个2行3列的全一数组
print(ones_arr)
打印结果如下所示:
[[1. 1. 1.]
[1. 1. 1.]]
4.3 创建单位矩阵
import numpy as np
eye_arr = np.eye(3) # 创建一个3x3的单位矩阵
print(eye_arr)
打印结果如下所示:
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
4.4 创建等差数列数组
import numpy as np
linspace_arr = np.linspace(0, 10, 5) # 创建一个从0到10的等差数列,包含5个元素
print(linspace_arr)
打印结果如下所示:
[ 0. 2.5 5. 7.5 10. ]
4.5 创建随机数组
import numpy as np
random_arr = np.random.rand(2, 3) # 创建一个2行3列的随机数组
print(random_arr)
打印结果如下所示:
[[0.74149082 0.47613219 0.30698208]
[0.37000744 0.98670655 0.40631318]]
5. 数组的索引与切片
NumPy数组的索引和切片操作与Python列表类似,但更加灵活。
5.1 一维数组的索引与切片
import numpy as np
arr = np.array([1, 2, 3, 4, 5])
print(arr[0]) # 输出第一个元素
print(arr[1:4]) # 输出第2到第4个元素
打印结果如下所示:
1
[2 3 4]
5.2 二维数组的索引与切片
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr[0, 1]) # 输出第1行第2列的元素
print(arr[:, 1]) # 输出第2列的所有元素
print(arr[1:3, 0:2]) # 输出第2到第3行,第1到第2列的子数组
打印结果如下所示:
2
[2 5 8]
[[4 5]
[7 8]]
6. 数组的操作
NumPy提供了许多操作数组的函数,如改变数组形状、拼接数组、分割数组等。
6.1 改变数组形状
arr = np.array([[1, 2, 3], [4, 5, 6]])
reshaped_arr = arr.reshape(3, 2) # 将数组形状改为3行2列
print(reshaped_arr)
打印结果如下所示:
[[1 2]
[3 4]
[5 6]]
6.2 拼接数组
import numpy as np
arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6], [7, 8]])
concatenated_arr = np.concatenate((arr1, arr2), axis=0) # 沿行方向拼接
print(concatenated_arr)
打印结果如下所示:
[[1 2]
[3 4]
[5 6]
[7 8]]
6.3 分割数组
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
split_arr = np.split(arr, 3, axis=0) # 沿行方向分割为3个子数组
print(split_arr)
打印结果如下所示:
[array([[1, 2, 3]]), array([[4, 5, 6]]), array([[7, 8, 9]])]
7. 数组的数学运算
NumPy提供了丰富的数学运算函数,可以对数组进行逐元素运算。
7.1 基本运算
import numpy as np
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
print(arr1 + arr2) # 逐元素相加
print(arr1 * arr2) # 逐元素相乘
print(np.dot(arr1, arr2)) # 点积
打印结果如下所示:
[5 7 9]
[ 4 10 18]
32
7.2 统计运算
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(np.sum(arr)) # 计算所有元素的和
print(np.mean(arr)) # 计算所有元素的平均值
print(np.max(arr)) # 计算所有元素的最大值
print(np.min(arr)) # 计算所有元素的最小值
print(np.std(arr)) # 计算所有元素的标准差
打印结果如下所示:
21
3.5
6
1
1.707825127659933
8. 广播机制
广播是NumPy中用于在不同形状的数组之间进行算术运算的机制。广播机制允许NumPy在执行元素级操作时,自动扩展较小的数组以匹配较大数组的形状。
import numpy as np
arr1 = np.array([[1, 2, 3], [4, 5, 6]])
arr2 = np.array([10, 20, 30])
# arr2会被广播为与arr1相同的形状
# arr2 = np.array([[10, 20, 30], [10, 20, 30]])
result = arr1 + arr2
print(result)
打印结果如下所示:
[[11 22 33]
[14 25 36]]
9. 线性代数运算
NumPy提供了许多线性代数运算函数,如矩阵乘法、求逆、求特征值等。
9.1 矩阵乘法
import numpy as np
arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6], [7, 8]])
result = np.dot(arr1, arr2) # 矩阵乘法
print(result)
打印结果如下所示:
[[19 22]
[43 50]]
9.2 求逆矩阵
import numpy as np
arr = np.array([[1, 2], [3, 4]])
inv_arr = np.linalg.inv(arr) # 求逆矩阵
print(inv_arr)
打印结果如下所示:
[[-2. 1. ]
[ 1.5 -0.5]]
9.3 求特征值和特征向量
import numpy as np
arr = np.array([[1, 2], [2, 1]])
eigenvalues, eigenvectors = np.linalg.eig(arr) # 求特征值和特征向量
print(eigenvalues)
print(eigenvectors)
打印结果如下所示:
[ 3. -1.]
[[ 0.70710678 -0.70710678]
[ 0.70710678 0.70710678]]
10. 随机数生成
NumPy提供了丰富的随机数生成函数,可以生成各种分布的随机数。
10.1 生成均匀分布的随机数
import numpy as np
random_arr = np.random.rand(2, 3) # 生成2行3列的均匀分布随机数
print(random_arr)
打印结果如下所示:
[[0.5009808 0.43969782 0.36369508]
[0.39248427 0.41931195 0.5787968 ]]
10.2 生成正态分布的随机数
import numpy as np
normal_arr = np.random.randn(2, 3) # 生成2行3列的正态分布随机数
print(normal_arr)
打印结果如下所示:
[[ 0.49734608 -0.16690934 0.44004618]
[-1.50584439 -0.63712034 0.71691208]]
10.3 生成随机整数
import numpy as np
int_arr = np.random.randint(0, 10, size=(2, 3)) # 生成2行3列的0到10之间的随机整数
print(int_arr)
打印结果如下所示:
[[7 1 3]
[1 4 8]]
11. 文件操作
NumPy提供了方便的文件操作函数,可以将数组保存到文件中,或从文件中加载数组。
11.1 保存数组到文件
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
np.save('array.npy', arr) # 将数组保存到文件
11.2 从文件加载数组
import numpy as np
loaded_arr = np.load('array.npy') # 从文件加载数组
print(loaded_arr)
打印结果如下所示:
[[1 2 3]
[4 5 6]]
11.3 保存和加载文本文件
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
np.savetxt('array.txt', arr) # 将数组保存为文本文件
loaded_arr = np.loadtxt('array.txt') # 从文本文件加载数组
print(loaded_arr)
打印结果如下所示:
[[1. 2. 3.]
[4. 5. 6.]]
12. 性能优化
NumPy的数组操作通常比Python的列表操作更快,但在处理大规模数据时,仍然需要注意性能优化。
12.1 避免使用循环
NumPy的数组操作是向量化的,尽量避免使用Python的循环操作数组。
# 不推荐
arr = np.array([1, 2, 3, 4, 5])
result = np.zeros_like(arr)
for i in range(len(arr)):
result[i] = arr[i] * 2
# 推荐
result = arr * 2
12.2 使用np.where()
进行条件操作
import numpy as np
arr = np.array([1, 2, 3, 4, 5])
result = np.where(arr > 3, arr, 0) # 将大于3的元素保留,其余置为0
print(result)
打印结果如下所示:
[0 0 0 4 5]
12.3 使用np.einsum()
进行高效的矩阵运算
import numpy as np
arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6], [7, 8]])
result = np.einsum('ij,jk->ik', arr1, arr2) # 高效的矩阵乘法
print(result)
打印结果如下所示:
[[19 22]
[43 50]]
作者:BigDataMagician