NumPy是Python科学计算的基础库,提供了高性能的多维数组对象和各种派生工具。本教程将全面介绍NumPy的核心功能和实际应用。
一、NumPy基础
1.1 数组创建
import numpy as np
# 创建一维数组
arr1 = np.array([1, 2, 3, 4, 5])
print("一维数组:", arr1)
# 创建二维数组
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
print("二维数组:\n", arr2)
# 创建特殊数组
zeros = np.zeros((3, 4)) # 全0数组
ones = np.ones((2, 3)) # 全1数组
eye = np.eye(3) # 单位矩阵
random = np.random.rand(2, 2) # 随机数组
1.2 数组属性和方法
# 数组属性
print("维度:", arr2.ndim)
print("形状:", arr2.shape)
print("数据类型:", arr2.dtype)
print("元素个数:", arr2.size)
# 数组变形
reshaped = arr1.reshape(5, 1) # 改变形状
flattened = arr2.flatten() # 展平数组
transposed = arr2.T # 转置
二、数组操作
2.1 索引和切片
# 一维数组索引
print(arr1[0]) # 第一个元素
print(arr1[-1]) # 最后一个元素
print(arr1[1:4]) # 切片
# 二维数组索引
print(arr2[0, 1]) # 第一行第二列
print(arr2[:, 1]) # 第二列所有元素
print(arr2[0:2, 1:3]) # 区块选择
2.2 数组运算
# 基本运算
x = np.array([1, 2, 3])
y = np.array([4, 5, 6])
print("加法:", x + y)
print("减法:", x - y)
print("乘法:", x * y) # 元素级乘法
print("除法:", x / y)
print("幂运算:", x ** 2)
# 统计运算
print("平均值:", x.mean())
print("最大值:", x.max())
print("最小值:", x.min())
print("标准差:", x.std())
print("求和:", x.sum())
三、高级特性
3.1 广播机制
# 广播示例
arr = np.array([[1, 2, 3], [4, 5, 6]])
scalar = 2
# 数组与标量运算
print("数组 * 标量:\n", arr * scalar)
# 不同形状数组运算
x = np.array([[1], [2], [3]])
y = np.array([4, 5, 6])
print("广播结果:\n", x + y)
3.2 矩阵运算
# 矩阵乘法
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
print("矩阵乘法:\n", np.dot(a, b))
# 或使用 @
print("矩阵乘法(@):\n", a @ b)
# 线性代数运算
print("行列式:", np.linalg.det(a))
print("逆矩阵:\n", np.linalg.inv(a))
print("特征值:", np.linalg.eigvals(a))
3.3 数组操作进阶
# 数组拼接
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
print("水平拼接:", np.hstack((arr1, arr2)))
print("垂直拼接:\n", np.vstack((arr1, arr2)))
# 数组分割
arr = np.array([1, 2, 3, 4, 5, 6])
print("数组分割:", np.split(arr, 3))
# 条件筛选
arr = np.array([1, 2, 3, 4, 5, 6])
mask = arr > 3
print("条件筛选:", arr[mask])
四、实际应用
4.1 图像处理
# 读取和处理图像
from PIL import Image
# 将图像转换为NumPy数组
img = Image.open('image.jpg')
img_array = np.array(img)
# 图像操作
rotated = np.rot90(img_array) # 旋转90度
flipped = np.fliplr(img_array) # 水平翻转
4.2 数据分析
# 生成示例数据
data = np.random.normal(0, 1, 1000)
# 统计分析
print("均值:", np.mean(data))
print("中位数:", np.median(data))
print("标准差:", np.std(data))
print("方差:", np.var(data))
# 直方图统计
histogram, bins = np.histogram(data, bins=30)
五、性能优化
5.1 向量化操作
# 避免使用循环的向量化操作
# 低效的循环方式
def slow_function(x):
result = np.zeros_like(x)
for i in range(len(x)):
result[i] = x[i] ** 2
return result
# 高效的向量化方式
def fast_function(x):
return x ** 2
# 性能对比
x = np.array([1, 2, 3, 4, 5])
5.2 内存优化
# 使用适当的数据类型
int_array = np.array([1, 2, 3], dtype=np.int32)
float_array = np.array([1.0, 2.0, 3.0], dtype=np.float32)
# 使用视图而不是复制
a = np.array([[1, 2, 3], [4, 5, 6]])
b = a.view() # 创建视图
c = a.copy() # 创建副本
总结
NumPy的主要优势:
- 高效的多维数组操作
- 强大的数学函数库
- 广播机制简化计算
- 与其他科学计算库良好集成
- 优秀的性能表现
使用建议:
- 熟练掌握数组操作基础
- 理解并善用广播机制
- 注意内存使用效率
- 尽量使用向量化操作
- 经常查阅官方文档获取最新特性