NumPy 是 Python 中用于科学计算的基础库之一。它提供了支持高效操作大型多维数组和矩阵的功能,并且包含了大量的数学函数库。以下是对 NumPy 的详细介绍,包括常用功能和示例代码。
1. 安装 NumPy
如果尚未安装 NumPy,可以使用以下命令进行安装:
pip install numpy
2. NumPy 基础
创建数组
NumPy 的核心是 ndarray
对象,它是一个多维数组。你可以通过多种方式创建 ndarray
。
import numpy as np
# 从列表创建数组
arr = np.array([1, 2, 3, 4])
print(arr) # 输出: [1 2 3 4]
# 创建多维数组
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr) # 输出: [[1 2 3]
# [4 5 6]]
# 创建全零数组
arr = np.zeros((2, 3))
print(arr) # 输出: [[0. 0. 0.]
# [0. 0. 0.]]
# 创建全一数组
arr = np.ones((2, 3))
print(arr) # 输出: [[1. 1. 1.]
# [1. 1. 1.]]
# 创建单位矩阵
arr = np.eye(3)
print(arr) # 输出: [[1. 0. 0.]
# [0. 1. 0.]
# [0. 0. 1.]]
# 创建随机数组
arr = np.random.rand(2, 3)
print(arr)
数组属性
NumPy 数组具有一些属性,可以帮助你了解数组的维度、形状和数据类型。
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr.ndim) # 数组维度,输出: 2
print(arr.shape) # 数组形状,输出: (2, 3)
print(arr.size) # 数组元素总数,输出: 6
print(arr.dtype) # 数组元素的数据类型,输出: int64
print(arr.itemsize) # 每个元素的字节大小,输出: 8
数组运算
NumPy 提供了大量的运算函数,使得数组运算非常高效。
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
# 数组加法
print(arr1 + arr2) # 输出: [5 7 9]
# 数组减法
print(arr1 - arr2) # 输出: [-3 -3 -3]
# 数组乘法
print(arr1 * arr2) # 输出: [ 4 10 18]
# 数组除法
print(arr1 / arr2) # 输出: [0.25 0.4 0.5 ]
# 数组与标量运算
print(arr1 * 2) # 输出: [2 4 6]
3. NumPy 高级功能
数组切片和索引
NumPy 数组可以进行切片和索引操作,这使得数据操作更加方便。
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 索引单个元素
print(arr[0, 2]) # 输出: 3
# 切片操作
print(arr[1:, 1:]) # 输出: [[5 6]
# [8 9]]
# 布尔索引
print(arr[arr > 5]) # 输出: [6 7 8 9]
# 花式索引
print(arr[[0, 2], [1, 2]]) # 输出: [2 9]
数组形状操作
NumPy 提供了多种改变数组形状的方法。
arr = np.array([[1, 2, 3], [4, 5, 6]])
# 数组展平
print(arr.ravel()) # 输出: [1 2 3 4 5 6]
# 数组转置
print(arr.T) # 输出: [[1 4]
# [2 5]
# [3 6]]
# 数组重塑
print(arr.reshape(3, 2)) # 输出: [[1 2]
# [3 4]
# [5 6]]
数组拼接和分割
NumPy 提供了拼接和分割数组的函数。
arr1 = np.array([[1, 2, 3], [4, 5, 6]])
arr2 = np.array([[7, 8, 9], [10, 11, 12]])
# 数组拼接
print(np.concatenate((arr1, arr2), axis=0)) # 纵向拼接
# 输出: [[ 1 2 3]
# [ 4 5 6]
# [ 7 8 9]
# [10 11 12]]
print(np.concatenate((arr1, arr2), axis=1)) # 横向拼接
# 输出: [[ 1 2 3 7 8 9]
# [ 4 5 6 10 11 12]]
# 数组分割
print(np.hsplit(arr1, 3)) # 按列分割
# 输出: [array([[1],
# [4]]), array([[2],
# [5]]), array([[3],
# [6]])]
print(np.vsplit(arr2, 2)) # 按行分割
# 输出: [array([[7, 8, 9]]), array([[10, 11, 12]])]
4. NumPy 广播机制
广播是一种用于对不同形状的数组进行算术运算的强大机制。
arr1 = np.array([[1, 2, 3], [4, 5, 6]])
arr2 = np.array([1, 2, 3])
# 广播机制
print(arr1 + arr2) # 输出: [[2 4 6]
# [5 7 9]]
5. 数学和统计函数
NumPy 提供了大量的数学和统计函数,用于数组的聚合和分析。
arr = np.array([[1, 2, 3], [4, 5, 6]])
# 数组求和
print(arr.sum()) # 输出: 21
# 最大值和最小值
print(arr.max()) # 输出: 6
print(arr.min()) # 输出: 1
# 按轴求和
print(arr.sum(axis=0)) # 输出: [5 7 9]
print(arr.sum(axis=1)) # 输出: [ 6 15]
# 平均值和标准差
print(arr.mean()) # 输出: 3.5
print(arr.std()) # 输出: 1.707825127659933
6. 线性代数
NumPy 包含一些线性代数函数,如矩阵乘法、逆矩阵、特征值分解等。
arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6], [7, 8]])
# 矩阵乘法
print(np.dot(arr1, arr2)) # 输出: [[19 22]
# [43 50]]
# 逆矩阵
print(np.linalg.inv(arr1)) # 输出: [[-2. 1. ]
# [ 1.5 -0.5]]
# 特征值和特征向量
values, vectors = np.linalg.eig(arr1)
print(values) # 输出: [-0.37228132 5.37228132]
print(vectors) # 输出: [[-0.82456484 -0.41597356]
# [ 0.56576746 -0.90937671]]
7. NumPy 随机模块
NumPy 的随机模块提供了生成随机数和随机样本的函数。
# 生成均匀分布的随机数
rand_nums = np.random.rand(5)
print(rand_nums) # 输出: [0.5488135 0.71518937 0.60276338 0.54488318 0.4236548 ]
# 生成正态分布的随机数
rand_nums = np.random.randn(5)
print(rand_nums) # 输出: [ 0.14404357 1.45427351 0.76103773 0.12167502 0.443