上一篇
NumPy数组完全指南:Python科学计算的核心 | Python教程
- Python
- 2025-07-29
- 1762
NumPy数组完全指南
Python科学计算的核心数据结构
什么是NumPy数组?
NumPy数组(ndarray)是Python科学计算的核心数据结构,提供了高性能的多维数组对象及操作这些数组的工具。
与Python原生列表相比,NumPy数组具有以下关键特性:
- 固定大小 - 创建后大小不可改变
- 同质数据类型 - 所有元素类型相同
- 高效内存使用 - 连续内存块存储
- 矢量化操作 - 避免显式循环
- 丰富的数学函数 - 内置高效数学运算
数组维度示例:
0维:标量
1维:向量
2维:矩阵
为什么使用NumPy数组?
NumPy数组相比Python列表具有显著性能优势:
性能对比
计算100万个元素的平方和:
- Python列表: ~150ms
- NumPy数组: < 1ms
* 性能提升达100倍以上
核心优势
- 高效内存使用 - 连续内存布局
- 矢量化操作 - 避免Python循环
- 广播机制 - 不同形状数组的运算
- 丰富的API - 线性代数、傅里叶变换等
- 其他库的基础 - Pandas、SciPy、Scikit-learn等
创建NumPy数组
多种方法创建NumPy数组:
基础创建方法
import numpy as np
# 从Python列表创建
arr1 = np.array([1, 2, 3, 4, 5])
# 创建全零数组
zeros = np.zeros((3, 4)) # 3行4列
# 创建全1数组
ones = np.ones((2, 3, 4)) # 2个3x4矩阵
# 创建范围数组
range_arr = np.arange(0, 10, 2) # [0, 2, 4, 6, 8]
# 创建线性间隔数组
lin_arr = np.linspace(0, 1, 5) # [0.0, 0.25, 0.5, 0.75, 1.0]
特殊数组创建
# 创建单位矩阵
identity = np.eye(3) # 3x3单位矩阵
# 创建对角矩阵
diagonal = np.diag([1, 2, 3, 4])
# 创建未初始化数组(内容随机)
empty_arr = np.empty((2, 2))
# 创建随机数组
random_arr = np.random.rand(2, 3) # 0-1均匀分布
randint_arr = np.random.randint(0, 10, (3, 3)) # 0-9随机整数
数组属性
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
属性说明
- ndim - 数组维度(轴数)
- shape - 数组形状(各维度大小)
- size - 数组元素总数
- dtype - 数组元素数据类型
- itemsize - 每个元素占字节数
- nbytes - 数组总字节数 (size * itemsize)
- flags - 数组内存布局信息
索引与切片
NumPy提供了灵活的数据访问方式:
基础索引
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 访问单个元素
print(arr[0, 1]) # 2
# 切片访问
print(arr[0:2, 1:3])
# 输出:[[2, 3],
# [5, 6]]
# 步长切片
print(arr[::2, ::2])
# 输出:[[1, 3],
# [7, 9]]
高级索引
# 布尔索引
bool_idx = arr > 4
print(arr[bool_idx]) # [5, 6, 7, 8, 9]
# 花式索引
print(arr[[0, 2], [0, 1]]) # [1, 8] (访问(0,0)和(2,1))
# 使用索引数组
rows = np.array([0, 2])
cols = np.array([1, 2])
print(arr[rows[:, np.newaxis], cols]) # 高级索引组合
数组操作
NumPy提供了丰富的数组操作函数:
形状操作
arr = np.arange(6) # [0, 1, 2, 3, 4, 5]
# 改变形状
arr2d = arr.reshape(2, 3)
# 转置
arr_t = arr2d.T
# 展平
flattened = arr2d.flatten()
# 调整大小
resized = np.resize(arr, (3, 3))
数组组合
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6]])
# 垂直堆叠
v_stack = np.vstack((a, b))
# 水平堆叠
h_stack = np.hstack((a, b.T))
# 深度堆叠
d_stack = np.dstack((a, a))
数学运算
NumPy支持高效的数组数学运算:
基本运算
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
# 元素级运算
print(a + b) # [5, 7, 9]
print(a * b) # [4, 10, 18]
print(a ** 2) # [1, 4, 9]
# 矩阵乘法
mat_a = np.array([[1, 2], [3, 4]])
mat_b = np.array([[5, 6], [7, 8]])
print(np.dot(mat_a, mat_b))
# 输出:[[19, 22],
# [43, 50]]
统计函数
arr = np.array([[1, 2], [3, 4], [5, 6]])
# 求和
print(np.sum(arr)) # 21
print(np.sum(arr, axis=0)) # [9, 12] (列求和)
print(np.sum(arr, axis=1)) # [3, 7, 11] (行求和)
# 其他统计
print("平均值:", np.mean(arr))
print("标准差:", np.std(arr))
print("最大值:", np.max(arr))
print("最小值:", np.min(arr))
print("中位数:", np.median(arr))
实际应用示例
NumPy数组在数据科学中的实际应用:
图像处理
# 将图像转换为NumPy数组
from PIL import Image
import numpy as np
# 加载图像
img = Image.open('image.jpg')
img_array = np.array(img)
# 获取图像属性
print("图像形状:", img_array.shape) # (height, width, channels)
print("数据类型:", img_array.dtype)
# 灰度转换
gray = np.dot(img_array[..., :3], [0.2989, 0.5870, 0.1140])
# 图像裁剪
cropped = img_array[100:400, 200:500, :]
# 颜色通道分离
red = img_array[:, :, 0]
green = img_array[:, :, 1]
blue = img_array[:, :, 2]
数据分析
# 分析温度数据
import numpy as np
# 生成模拟数据
days = 365
temp = 20 + 10 * np.random.randn(days) # 平均20°C,标准差10
# 数据处理
mean_temp = np.mean(temp)
max_temp = np.max(temp)
min_temp = np.min(temp)
# 统计超过30°C的天数
hot_days = np.sum(temp > 30)
# 计算每月平均温度
monthly_avg = temp.reshape(12, -1).mean(axis=1)
print(f"年平均温度: {mean_temp:.1f}°C")
print(f"最高温度: {max_temp}°C, 最低温度: {min_temp}°C")
print(f"炎热天数(>30°C): {hot_days}天")
NumPy数组总结
核心优势
- 高效的内存使用
- 快速的数值计算
- 丰富的数学函数
- 广播机制
- 多维数据结构
适用场景
- 科学计算
- 数据分析
- 机器学习
- 图像处理
- 信号处理
学习路径
- 掌握数组创建
- 熟练索引切片
- 理解广播机制
- 熟悉常用函数
- 实践实际项目
NumPy数组是Python科学计算生态系统的基石,掌握NumPy是进行高效数据分析和科学计算的第一步!
本文由RuanYan于2025-07-29发表在吾爱品聚,如有疑问,请联系我们。
本文链接:https://www.521pj.cn/20256754.html
发表评论