Numpy 数组操作
在 NumPy 中,数组操作是处理 ndarray
(N 维数组)的核心功能,涵盖形状操作、数学运算、统计函数、排序、连接与分割等。NumPy 的数组操作高效且灵活,广泛应用于数据分析、科学计算和机器学习。以下是对 NumPy 数组操作的详细中文讲解,涵盖主要操作类型、示例、注意事项及最佳实践,帮助你全面掌握 NumPy 数组操作。
一、NumPy 数组操作概述
1. 什么是数组操作?
- 定义:数组操作指对
ndarray
进行形状调整、元素计算、统计分析、排序、连接或分割等操作。 - 特点:
- 向量化:支持元素级运算,避免显式循环。
- 高效性:基于 C 实现,性能优于 Python 循环。
- 多维支持:适用于任意维度的数组。
- 用途:
- 数据预处理:调整形状、标准化数据。
- 数学计算:矩阵运算、统计分析。
- 数据重组:排序、连接、分割数组。
2. 数组操作的分类
- 形状操作:调整数组形状(如重塑、转置)。
- 数学运算:元素级运算、矩阵运算。
- 统计函数:计算均值、标准差等。
- 排序操作:对数组元素排序。
- 连接与分割:合并或拆分数组。
二、数组操作的类型与用法
以下按类别详细讲解 NumPy 的数组操作。
1. 形状操作
形状操作用于调整数组的维度、形状或结构。
(1) 重塑(reshape
)
- 描述:改变数组形状,保持元素总数不变。
- 语法:
arr.reshape(new_shape)
- 示例:
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6])
reshaped = arr.reshape(2, 3)
print(reshaped)
# 输出:
# [[1 2 3]
# [4 5 6]]
- 注意:元素总数必须匹配:
# arr.reshape(2, 4) # 报错:不能重塑为 2x4(8 个元素)
(2) 展平(flatten
或 ravel
)
- 描述:将多维数组展平为一维。
- 语法:
arr.flatten() # 返回副本
arr.ravel() # 返回视图
- 示例:
arr = np.array([[1, 2], [3, 4]])
flat = arr.flatten()
print(flat) # 输出:[1 2 3 4]
raveled = arr.ravel()
raveled[0] = 10
print(arr) # 输出:[[10 2] [3 4]](因 ravel 返回视图)
(3) 转置(T
或 transpose
)
- 描述:交换数组的行列(或维度)。
- 语法:
arr.T
arr.transpose(axes)
- 示例:
arr = np.array([[1, 2], [3, 4]])
print(arr.T)
# 输出:
# [[1 3]
# [2 4]]
- 多维转置:
arr3d = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
print(arr3d.transpose(1, 0, 2)) # 调整维度顺序
(4) 调整大小(resize
)
- 描述:改变数组形状,可改变元素总数(填充或截断)。
- 语法:
arr.resize(new_shape) # 原地修改
np.resize(arr, new_shape) # 返回新数组
- 示例:
arr = np.array([1, 2, 3])
arr.resize(5) # 填充 0
print(arr) # 输出:[1 2 3 0 0]
2. 数学运算
NumPy 支持元素级运算和矩阵运算,基于广播机制。
(1) 元素级运算
- 描述:对数组元素逐个应用运算(如加、减、乘、除)。
- 示例:
arr = np.array([[1, 2], [3, 4]])
print(arr + 2) # 广播
# 输出:
# [[3 4]
# [5 6]]
print(arr * arr) # 元素级乘法
# 输出:
# [[ 1 4]
# [ 9 16]]
- 通用函数(ufunc):
print(np.sqrt(arr)) # 开方
# 输出:
# [[1. 1.41]
# [1.73 2. ]]
(2) 矩阵运算
- 描述:支持矩阵点积、矩阵乘法等。
- 语法:
np.dot(a, b) # 点积
np.matmul(a, b) # 矩阵乘法
- 示例:
arr = np.array([[1, 2], [3, 4]])
print(np.dot(arr, arr)) # 矩阵乘法
# 输出:
# [[ 7 10]
# [15 22]]
3. 统计函数
统计函数用于计算数组的统计特性。
- 常见函数:
np.mean
:均值np.std
:标准差np.sum
:求和np.max
、np.min
:最大/最小值np.median
:中位数- 示例:
arr = np.array([[1, 2], [3, 4]])
print(np.mean(arr)) # 输出:2.5
print(np.std(arr)) # 输出:1.118...
print(np.sum(arr, axis=0)) # 按列求和
# 输出:[4 6]
4. 排序操作
- 描述:对数组元素排序,支持按轴排序。
- 语法:
np.sort(arr, axis=-1, kind='quicksort')
np.argsort(arr, axis=-1) # 返回排序索引
- 示例:
arr = np.array([[3, 1], [4, 2]])
print(np.sort(arr, axis=1)) # 按行排序
# 输出:
# [[1 3]
# [2 4]]
print(np.argsort(arr, axis=1)) # 排序索引
# 输出:
# [[1 0]
# [1 0]]
5. 连接与分割
- 连接:
np.concatenate
:沿指定轴连接数组。np.vstack
:垂直(行)堆叠。np.hstack
:水平(列)堆叠。- 示例(连接):
arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6], [7, 8]])
print(np.vstack((arr1, arr2))) # 垂直堆叠
# 输出:
# [[1 2]
# [3 4]
# [5 6]
# [7 8]]
- 分割:
np.split
:沿指定轴分割数组。np.vsplit
:垂直分割。np.hsplit
:水平分割。- 示例(分割):
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(np.hsplit(arr, 3)) # 水平分割为 3 份
# 输出:[array([[1], [4]]), array([[2], [5]]), array([[3], [6]])]
三、实际应用场景
1. 数据标准化
将数组归一化(零均值,单位方差):
arr = np.array([[1, 2], [3, 4]])
mean = np.mean(arr, axis=0)
std = np.std(arr, axis=0)
normalized = (arr - mean) / std
print(normalized)
2. 矩阵运算
计算矩阵的点积:
matrix = np.array([[1, 2], [3, 4]])
result = np.dot(matrix, matrix.T)
print(result)
# 输出:
# [[ 5 11]
# [11 25]]
3. 数据排序
按列排序:
arr = np.array([[3, 1], [4, 2]])
sorted_arr = np.sort(arr, axis=0) # 按列排序
print(sorted_arr)
# 输出:
# [[3 1]
# [4 2]]
4. 数组重组
将一维数组重塑为矩阵并连接:
arr = np.arange(6)
matrix = arr.reshape(2, 3)
combined = np.vstack((matrix, matrix))
print(combined)
# 输出:
# [[0 1 2]
# [3 4 5]
# [0 1 2]
# [3 4 5]]
四、注意事项
- 视图 vs 副本:
- 形状操作(如
reshape
、ravel
)通常返回视图,修改会影响原数组:python arr = np.array([1, 2, 3]) view = arr.reshape(1, 3) view[0, 0] = 10 print(arr) # 输出:[10 2 3]
- 使用
copy()
创建副本:python copy = arr.reshape(1, 3).copy()
- 形状匹配:
- 重塑或连接时,元素总数或轴长度需匹配:
python arr = np.array([1, 2, 3]) # arr.reshape(2, 2) # 报错:不匹配
- 性能优化:
- 优先使用向量化操作,避免循环:
python arr = np.array([1, 2, 3]) arr = arr * 2 # 快于 for 循环
- 数据类型:
- 运算可能改变
dtype
:python arr = np.array([1, 2], dtype=np.int32) result = arr / 2 print(result.dtype) # 输出:float64
- 轴(axis)指定:
- 统计或连接操作需明确轴:
python arr = np.array([[1, 2], [3, 4]]) print(np.sum(arr, axis=0)) # 按列求和:[4 6]
五、最佳实践
- 向量化优先:
- 使用 NumPy 内置函数和广播:
python arr = np.array([[1, 2], [3, 4]]) arr = arr + 1 # 高效
- 检查形状:
- 操作前确认
shape
:python print(arr.shape)
- 优化内存:
- 使用视图(如
ravel
)而非副本(如flatten
):python flat = arr.ravel()
- 显式数据类型:
- 指定
dtype
避免意外转换:python arr = np.array([1, 2], dtype=np.float32)
- 结合其他库:
- 与 Pandas、Matplotlib 集成:
python import pandas as pd df = pd.DataFrame(arr) print(df.mean(axis=0))
- 调试输出:
- 使用
np.set_printoptions
控制显示:python np.set_printoptions(precision=2)
六、总结
NumPy 的数组操作包括形状调整(reshape
、flatten
)、数学运算(元素级、矩阵运算)、统计函数(mean
、std
)、排序(sort
)和连接/分割(vstack
、split
)。这些操作高效、灵活,适合多维数据处理。遵循最佳实践(如向量化、检查形状、优化内存),并注意视图与副本、形状匹配等问题,能提升代码效率和可靠性。
如果你需要更复杂的示例(如多维运算、性能优化)或特定场景的代码,请告诉我!