Python的NumPy库(Numerical Python的简称)是一个开源的Python数值计算扩展程序库,用于处理大型多维数组和矩阵。它包含了大量的数学函数来操作这些数组,提供了大量的高级数学函数来操作这些数组,可以用来执行各种与数组相关的操作,如数值计算、线性代数、统计等。
NumPy的主要特点包括:
-
强大的N维数组对象:NumPy使用ndarray对象来处理数组,它支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
-
广播功能:NumPy的广播功能使得不同大小的数组在进行算术运算时能够按照一定规则进行扩展。
-
高效的内存管理:数组对象的元素都存储在一块连续的内存块上,并且这个内存块只受NumPy控制,用户不需要关心内存管理的问题。
-
方便的函数:NumPy提供了大量的函数,用于对数组进行各种数学和逻辑运算,如排序、选择、数学函数等。
-
整合C/C++/Fortran代码的能力:NumPy可以很好地和C/C++/Fortran代码进行交互,这使得NumPy在执行计算密集型任务时非常高效。
-
科学计算的基础:许多其他科学计算库,如SciPy、Pandas、Matplotlib等,都是建立在NumPy的基础之上的。
NumPy的基本使用
NumPy库在Python中广泛用于处理大型多维数组和矩阵,提供大量的数学函数进行数组运算。以下是一些NumPy的基本使用示例:
1.创建数组:
NumPy提供了多种创建数组的方式。你可以从Python的list数据创建数组,也可以使用NumPy自带的函数如np.zeros()
, np.ones()
, np.arange()
等来创建具有特定值的数组。
import numpy as np
# 从list创建数组
arr_from_list = np.array([1, 2, 3, 4, 5])
print(arr_from_list)
# 创建全零数组
zeros_arr = np.zeros(5)
print(zeros_arr)
# 创建等差数列数组
arange_arr = np.arange(0, 10, 2) # 从0开始,到10结束(不包含),步长为2
print(arange_arr)
输出结果:
[1 2 3 4 5]
[0. 0. 0. 0. 0.]
[0 2 4 6 8]
2.数组索引和切片:
NumPy数组支持类似于Python原生list的索引和切片操作。
import numpy as np
# 从list创建数组
arr_from_list = np.array([1, 2, 3, 4, 5])
# 索引
print(arr_from_list[0]) # 输出数组的第一个元素
# 切片
print(arr_from_list[1:4]) # 输出数组的第二到第四个元素(不包含第四个)
输出结果:
1
[2 3 4]
3.基本数学运算:
NumPy支持数组间的元素级运算,如加法、减法、乘法、除法等。
import numpy as np
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
# 元素级加法
print(arr1 + arr2)
# 元素级乘法
print(arr1 * arr2)
输出结果:
[5 7 9]
[ 4 10 18]
4.改变数组维度:
NumPy允许你改变数组的维度,例如使用reshape
方法。
import numpy as np
flat_arr = np.arange(6)
print(flat_arr)
reshaped_arr = flat_arr.reshape(2, 3) # 将一维数组变为二维数组
print(reshaped_arr)
输出结果:
[0 1 2 3 4 5]
[[0 1 2]
[3 4 5]]
5.条件筛选:
你可以使用条件表达式对数组进行筛选。
import numpy as np
# 创建一个数组
arr = np.array([1, 2, 3, 4, 5])
# 筛选出大于3的元素
print(arr)
filtered_arr = arr[arr > 3]
print(filtered_arr)
输出结果:
[1 2 3 4 5]
[4 5]
6.广播:
广播是NumPy用于处理不同形状数组之间算术运算的一种强大机制。它允许NumPy在执行元素级运算时自动扩展数组的维度。
import numpy as np
a = np.array([[1, 2, 3]])
b = np.array([1, 2, 3])
# 由于广播,以下操作是有效的
c = a + b
print(c)
输出结果:
[[2 4 6]]
7.统计函数:
NumPy提供了许多用于数组统计的函数,如sum()
, mean()
, max()
, min()
等。
import numpy as np
# 创建一个数组
arr = np.array([1, 2, 3, 4, 5])
# 计算数组的和
print(np.sum(arr))
# 计算数组的平均值
print(np.mean(arr))
输出结果:
15
3.0
8.线性代数:
NumPy还提供了线性代数功能,如矩阵乘法、矩阵逆、行列式等。
import numpy as np
# 创建两个二维数组(矩阵)
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
# 矩阵乘法
print(np.dot(A, B))
输出结果:
[[19 22]
[43 50]]
举例:求解线性方程组的唯一解
例:
import numpy as np
a = np.array([[3, 1], [1, 2]])
b = np.array([9, 8])
x1 = np.linalg.inv(a) @ b #第一种解法
#上面语句中@表示矩阵乘法
x2 = np.linalg.solve(a, b) #第二种解法
print(x1); print(x2)
输出结果:
[2. 3.] [2. 3.]
备注:这两种方法都应该给出相同的解,即x = [2, 3]
。注意,虽然第一种方法使用矩阵的逆来计算解是可行的,但在实际计算中,直接使用np.linalg.solve
更为推荐,因为它避免了计算逆矩阵可能带来的数值不稳定性和额外的计算成本。