目录
引言
NumPy(Numerical Python)是Python科学计算的核心库,为高效处理多维数组和矩阵运算而生。在机器学习、数据分析、图像处理等领域应用广泛。本文将深入解析NumPy的核心功能,并通过20+个实战代码示例,助您快速掌握这个强大的数值计算工具。
一、NumPy环境配置与基础概念
1.1 安装NumPy
pip install numpy
1.2 导入惯例
import numpy as np # 行业标准缩写
1.3 核心数据结构:ndarray
arr = np.array([1, 2, 3]) # 创建一维数组
print(type(arr)) # <class 'numpy.ndarray'>
二、数组创建与基础操作
2.1 数组创建方法
# 从Python列表创建
a = np.array([[1,2,3], [4,5,6]])
# 特殊数组创建
zeros_arr = np.zeros((2,3)) # 全0数组
ones_arr = np.ones((3,2)) # 全1数组
eye_arr = np.eye(3) # 单位矩阵
range_arr = np.arange(0,10,2) # 等差数组 [0,2,4,6,8]
linspace_arr = np.linspace(0, 1, 5) # 等分数组 [0., 0.25, 0.5, 0.75, 1.]
# 随机数组
rand_arr = np.random.rand(2,3) # 0-1均匀分布
# array([[1.34071899e-01, 9.36942889e-01, 3.61816714e-01],
# [2.04127329e-04, 6.14073055e-01, 5.29086234e-02]])
normal_arr = np.random.normal(0, 1, (2,2)) # 正态分布
# array([[-0.82062067, -0.69695613],
# [ 0.13595297, 0.15058538]])
2.2 数组属性
arr = np.array([[1,2,3],[4,5,6]])
print(arr.ndim) # 维度数 → 2
print(arr.shape) # 形状 → (2,3) - 2行3列
print(arr.size) # 元素总数 → 6
print(arr.dtype) # 数据类型 → int32
2.3 数据类型转换
arr = np.array([1.5, 2.8, 3.2])
int_arr = arr.astype(np.int32) # [1, 2, 3]
三、数组索引与切片
3.1 基础索引
arr = np.array([[1,2,3], [4,5,6], [7,8,9]])
print(arr[0, 1]) # 2 → 第0行第1列
print(arr[:, 1]) # [2,5,8] → 所有行的第1列
print(arr[1:3, :2]) # [[4,5], [7,8]] → 1-2行,前两列
3.2 布尔索引
arr = np.array([3, 1, 4, 1, 5])
filter = arr > 2
print(arr[filter]) # [3,4,5]
3.3 花式索引
arr = np.arange(25).reshape(5,5)
# array([[ 0, 1, 2, 3, 4],
# [ 5, 6, 7, 8, 9],
# [10, 11, 12, 13, 14],
# [15, 16, 17, 18, 19],
# [20, 21, 22, 23, 24]])
print(arr[[0,2,4], [1,3,0]]) # 选取(0,1),(2,3),(4,0)位置元素 → [1,13,20]
四、数组运算与广播机制
4.1 数学运算
a = np.array([1,2,3])
b = np.array([4,5,6])
print(a + b) # [5 7 9]
print(a * 2) # [2 4 6]
print(np.sqrt(a)) # [1. 1.414 1.732]
4.2 矩阵运算
mat_a = np.array([[1,2],[3,4]])
mat_b = np.array([[5,6],[7,8]])
# 矩阵乘法
print(mat_a @ mat_b)
# [[19 22]
# [43 50]]
4.3 广播机制
a = np.array([[1,2,3], [4,5,6]])
b = np.array([10,20,30])
print(a + b)
# [[11 22 33]
# [14 25 36]]
五、数组形状操作
5.1 改变形状
arr = np.arange(6)
# array([0, 1, 2, 3, 4, 5])
print(arr.reshape(2,3)) # 改变形状
# array([[0, 1, 2],
# [3, 4, 5]])
print(arr.flatten()) # 展平为一维数组
# array([0, 1, 2, 3, 4, 5])
5.2 转置与轴变换
arr = np.arange(8).reshape(2,2,2)
# array([[[0, 1],
# [2, 3]],
#
# [[4, 5],
# [6, 7]]])
print(arr.transpose(1,0,2)) # 交换前两个轴
# array([[[0, 1],
# [4, 5]],
#
# [[2, 3],
# [6, 7]]])
六、常用统计函数
6.1 基础统计
data = np.random.normal(0, 1, 100)
print(np.mean(data)) # 平均值
print(np.median(data)) # 中位数
print(np.std(data)) # 标准差
print(data.max() - data.min()) # 极差
6.2 沿轴计算
arr = np.arange(12).reshape(3,4)
print(arr.sum(axis=0)) # 列求和 → [12 15 18 21]
print(arr.mean(axis=1)) # 行平均 → [1.5 5.5 9.5]
七、实战案例集合
7.1 图像处理(需安装matplotlib)
import matplotlib.pyplot as plt
# 创建灰度图像数组
image = np.random.randint(0,256, (100,100), dtype=np.uint8)
# 图像反转
inverted = 255 - image
plt.imshow(inverted, cmap='gray')
plt.show()
7.2 数据标准化
data = np.random.rand(100, 5)
# Z-Score标准化
mean = data.mean(axis=0)
std = data.std(axis=0)
normalized = (data - mean) / std
7.3 多项式计算
# 计算f(x) = x^3 + 2x + 5 在x=3处的值
coeff = [1, 0, 2, 5] # 系数从高次到低次
print(np.polyval(coeff, 3)) # 3^3 + 2*3 +5 = 38
八、性能优化技巧
8.1 向量化运算
# 低效的循环实现
result = []
for i in range(10000):
result.append(i**2)
# 高效的向量化实现
result = np.arange(10000)**2
8.2 内存优化
arr = np.ones((1000,1000), dtype=np.float64)
arr = arr.astype(np.float32) # 内存占用减少一半
九、常见问题解决方案
9.1 形状不匹配错误
a = np.array([1,2,3])
b = np.array([[1],[2],[3]])
# 正确广播操作
print(a + b)
# [[2 3 4]
# [3 4 5]
# [4 5 6]]
9.2 数据保存与加载
# 保存数组
np.save('data.npy', arr)
# 加载数组
loaded_arr = np.load('data.npy')
结语
NumPy是Python科学计算的基石,掌握其核心功能将为您打开数据科学的大门。建议:
多做数组形状变换练习
深入理解广播机制
结合Matplotlib进行可视化实践
探索NumPy与其他库(如Pandas)的集成使用