NumPy 简介
NumPy 是 Python 科学计算的基础库,提供了高性能的多维数组对象和丰富的数学函数。它是 Pandas、Matplotlib、Scikit-learn 等库的基础。
安装与导入
pip install numpy
import numpy as np
创建数组
# 从列表创建
arr1 = np.array([1, 2, 3, 4, 5])
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
# 特殊数组
zeros = np.zeros((3, 3)) # 3x3 零矩阵
ones = np.ones((2, 4)) # 2x4 全1矩阵
eye = np.eye(4) # 4x4 单位矩阵
diag = np.diag([1, 2, 3]) # 对角矩阵
# 等差序列
arr = np.arange(0, 10, 2) # [0, 2, 4, 6, 8]
arr = np.linspace(0, 1, 5) # [0, 0.25, 0.5, 0.75, 1]
# 随机数组
rand = np.random.rand(3, 3) # 均匀分布
randn = np.random.randn(3, 3) # 正态分布
randint = np.random.randint(0, 10, (3, 3)) # 随机整数
数组属性
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr.shape) # (2, 3) - 形状
print(arr.ndim) # 2 - 维度数
print(arr.size) # 6 - 元素总数
print(arr.dtype) # int64 - 数据类型
print(arr.itemsize) # 8 - 每个元素的字节数
数组索引与切片
arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
# 基础索引
print(arr[0, 0]) # 1
print(arr[1, 2]) # 7
# 切片
print(arr[0:2, 1:3]) # [[2, 3], [6, 7]]
print(arr[:, 0]) # [1, 5, 9] - 第一列
print(arr[1, :]) # [5, 6, 7, 8] - 第二行
# 花式索引
print(arr[[0, 2], :]) # 第1行和第3行
print(arr[:, [1, 3]]) # 第2列和第4列
数组运算
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
# 逐元素运算
print(a + b) # [[6, 8], [10, 12]]
print(a * b) # [[5, 12], [21, 32]]
print(a ** 2) # [[1, 4], [9, 16]]
# 矩阵运算
print(a @ b) # 矩阵乘法
print(np.dot(a, b)) # 点积
print(a.T) # 转置
# 统计运算
print(np.mean(a)) # 均值
print(np.std(a)) # 标准差
print(np.max(a)) # 最大值
print(np.sum(a, axis=0)) # 按列求和
广播机制
# 广播:不同形状的数组可以进行运算
arr = np.array([[1, 2, 3], [4, 5, 6]])
row = np.array([10, 20, 30])
print(arr + row) # 每行都加上 row
# [[11, 22, 33], [14, 25, 36]]
col = np.array([[10], [20]])
print(arr + col) # 每列都加上 col
# [[11, 12, 13], [24, 25, 26]]
实用函数
# 条件筛选
arr = np.array([1, 2, 3, 4, 5, 6])
print(arr[arr > 3]) # [4, 5, 6]
# 花式条件
mask = (arr > 2) & (arr < 5)
print(arr[mask]) # [3, 4]
# 排序
arr = np.array([3, 1, 4, 1, 5, 9])
print(np.sort(arr)) # [1, 1, 3, 4, 5, 9]
# 去重
arr = np.array([1, 2, 2, 3, 3, 3])
print(np.unique(arr)) # [1, 2, 3]
# 随机操作
arr = np.array([1, 2, 3, 4, 5])
np.random.shuffle(arr) # 原地打乱
print(arr)
# 保存和加载
np.save('array.npy', arr)
loaded = np.load('array.npy')
性能对比
import time
# Python 列表
start = time.time()
py_list = [i**2 for i in range(1000000)]
print(f"Python 列表: {time.time() - start:.4f} 秒")
# NumPy 数组
start = time.time()
np_arr = np.arange(1000000) ** 2
print(f"NumPy 数组: {time.time() - start:.4f} 秒")
# NumPy 通常比纯 Python 快 10-100 倍
小贴士: 尽量使用 NumPy 的向量化操作,避免使用 Python 循环,这样可以显著提高代码性能。
总结
NumPy 是 Python 数据科学的基石,掌握它的数组操作将为后续学习 Pandas、机器学习打下坚实基础。