NumPy
是 Python 科学计算库中非常重要的库,主要用于处理大型多维数组和矩阵运算。它提供了大量数学函数来操作这些数组。 NumPy
的核心是 ndarray
对象,该对象是一个多维数组,可以存储同类型的数据。 下面是 NumPy
的详细用法和功能介绍:
在使用 NumPy
之前,需要先导入库,通常我们会将 NumPy
以 np
作为别名:
importnumpy asnp
NumPy 中的数组称为 ndarray
,可以通过多种方式创建数组:
array()
创建数组# 从Python列表创建数组arr =np.array([1,2,3,4])print(arr)# 输出: [1 2 3 4]# 创建多维数组arr_2d =np.array([[1,2],[3,4]])print(arr_2d)# 输出: [[1 2] [3 4]]
zeros()
、ones()
和 full()
创建特定值数组# 创建一个全为0的数组zeros_arr =np.zeros((2,3))print(zeros_arr)# 输出:[[0. 0. 0.] [0. 0. 0.]]# 创建一个全为1的数组ones_arr =np.ones((2,3))print(ones_arr)# 输出:[[1. 1. 1.] [1. 1. 1.]]# 创建一个指定数值的数组full_arr =np.full((2,2),5)print(full_arr)# 输出:[[5 5] [5 5]]
arange()
和 linspace()
创建序列数组# 创建一个等差序列数组arr_range =np.arange(0,10,2)print(arr_range)# 输出:[0 2 4 6 8]# 创建一个线性间隔数组arr_linspace =np.linspace(0,1,5)print(arr_linspace)# 输出:[0. 0.25 0.5 0.75 1. ]
ndarray
对象具有多种属性,可以获取数组的信息:
arr =np.array([[1,2,3],[4,5,6]])print(arr.shape)# 数组的形状 (2, 3)print(arr.size)# 数组中的元素数量 6print(arr.ndim)# 数组的维度 2print(arr.dtype)# 数组元素的数据类型 int64
NumPy
数组支持多维索引和切片操作。
arr =np.array([1,2,3,4,5])print(arr[0])# 输出第一个元素:1print(arr[-1])# 输出最后一个元素:5
arr_2d =np.array([[1,2,3],[4,5,6]])print(arr_2d[0,2])# 输出第一行第三列的元素:3print(arr_2d[1,-1])# 输出第二行最后一个元素:6
# 一维数组切片arr =np.array([1,2,3,4,5])print(arr[1:4])# 输出: [2 3 4]# 多维数组切片arr_2d =np.array([[1,2,3],[4,5,6],[7,8,9]])print(arr_2d[0:2,1:3])# 输出:[[2 3] [5 6]]
NumPy
可以对数组进行广播机制下的运算。
arr =np.array([1,2,3])print(arr +2)# 输出:[3 4 5]print(arr *3)# 输出:[3 6 9]print(arr **2)# 输出:[1 4 9]
arr1 =np.array([1,2,3])arr2 =np.array([4,5,6])print(arr1 +arr2)# 输出:[5 7 9]print(arr1 *arr2)# 输出:[4 10 18]
NumPy
提供了许多通用的数学函数,可以应用于数组的每个元素,例如 sin()
、exp()
、sqrt()
等。
arr =np.array([1,2,3])print(np.sin(arr))# 输出:数组每个元素的正弦值print(np.exp(arr))# 输出:数组每个元素的指数值print(np.sqrt(arr))# 输出:数组每个元素的平方根
NumPy
提供了许多工具来改变数组的形状。
reshape()
改变数组形状arr =np.array([[1,2,3],[4,5,6]])reshaped_arr =arr.reshape((3,2))print(reshaped_arr)# 输出:# [[1 2]# [3 4]# [5 6]]
arr =np.array([[1,2,3],[4,5,6]])print(arr.T)# 输出:# [[1 4]# [2 5]# [3 6]]
NumPy
支持对数组的合并和分割操作。
arr1 =np.array([[1,2],[3,4]])arr2 =np.array([[5,6]])# 垂直合并vstack_arr =np.vstack((arr1,arr2))print(vstack_arr)# 输出:[[1 2] [3 4] [5 6]]# 水平合并hstack_arr =np.hstack((arr1,arr2.T))print(hstack_arr)# 输出:[[1 2 5] [3 4 6]]
arr =np.array([[1,2,3],[4,5,6]])# 垂直分割vsplit_arr =np.vsplit(arr,2)print(vsplit_arr)# 输出两个2x3的数组# 水平分割hsplit_arr =np.hsplit(arr,3)print(hsplit_arr)# 输出三个2x1的数组
NumPy 支持布尔条件筛选和索引操作。
arr =np.array([1,2,3,4,5])print(arr[arr >3])# 输出:[4 5]# 条件赋值arr[arr >3]=0print(arr)# 输出:[1 2 3 0 0]
NumPy
提供了丰富的统计函数,方便对数组进行统计计算。
arr =np.array([1,2,3,4,5])print(np.mean(arr))# 平均值:3.0print(np.sum(arr))# 总和:15print(np.std(arr))# 标准差:1.414print(np.min(arr))# 最小值:1print(np.max(arr))# 最大值:5
NumPy
的 random
模块提供了生成随机数的功能。
# 生成一个[0, 1)之间的随机浮点数print(np.random.rand())# 生成一个服从标准正态分布的随机数print(np.random.randn())# 生成一个指定范围内的随机整数print(np.random.randint(0,10,(3,3)))# 输出一个3x3的随机整数矩阵
NumPy
具有广播(broadcasting)机制,是指当操作的两个数组形状不同,但其中一个数组的形状可以通过重复某些维度的元素来匹配另一个数组的形状时,NumPy 会自动进行元素扩展,执行操作。
# 一个 1x3 数组和一个 3x1 数组相加a =np.array([1,2,3])b =np.array([[1],[2],[3]])# 广播机制:将b广播为 [1, 2, 3],然后执行加法result =a +bprint(result)# 输出:# [[2 3 4]# [3 4 5]# [4 5 6]]
NumPy 中的矩阵运算功能包括矩阵乘法、矩阵转置、求逆等常见的线性代数操作。特别适用于科学计算和机器学习中使用的线性代数方法。
a) 矩阵乘法
@ 符号或 np.dot() 函数可用于矩阵乘法。
# 定义两个矩阵A =np.array([[1,2],[3,4]])B =np.array([[5,6],[7,8]])# 矩阵乘法C =A @ Bprint(C)# 输出:# [[19 22]# [43 50]]# 使用dot函数D =np.dot(A,B)print(D)# 输出结果与上面相同
b) 矩阵转置
# 矩阵转置A_T =A.Tprint(A_T)# 输出:# [[1 3]# [2 4]]
d) 计算行列式
使用 np.linalg.det() 计算矩阵的行列式。
A =np.array([[1,2],[3,4]])det_A =np.linalg.det(A)print(det_A)# 输出:-2.0
e) 特征值和特征向量
使用 np.linalg.eig() 来计算矩阵的特征值和特征向量。
A =np.array([[1,2],[3,4]])eigenvalues,eigenvectors =np.linalg.eig(A)print("特征值:",eigenvalues)print("特征向量:",eigenvectors)# 输出:# 特征值: [-0.37228132 5.37228132]# 特征向量:# [[-0.82456484 -0.41597356]# [ 0.56576746 -0.90937671]]
a) 排序
使用 np.sort() 函数对数组进行排序。该函数会返回一个排序后的数组,而不会修改原数组。
a =np.array([3,1,2,4])sorted_a =np.sort(a)print(sorted_a)# 输出:[1 2 3 4]
b) 条件筛选
NumPy 提供了灵活的条件筛选操作,可以用布尔数组来选择满足条件的元素。
# 创建一个数组a =np.array([1,2,3,4,5])# 筛选出大于2的元素filtered_a =a[a >2]print(filtered_a)# 输出:[3 4 5]# 使用where条件筛选b =np.where(a >2,a,-1)# 大于2的保持原值,否则设为-1print(b)# 输出:[-1 -1 3 4 5]