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) 展平(flattenravel

  • 描述:将多维数组展平为一维。
  • 语法
  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) 转置(Ttranspose

  • 描述:交换数组的行列(或维度)。
  • 语法
  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.maxnp.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]]

四、注意事项

  1. 视图 vs 副本
  • 形状操作(如 reshaperavel)通常返回视图,修改会影响原数组:
    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()
  1. 形状匹配
  • 重塑或连接时,元素总数或轴长度需匹配:
    python arr = np.array([1, 2, 3]) # arr.reshape(2, 2) # 报错:不匹配
  1. 性能优化
  • 优先使用向量化操作,避免循环:
    python arr = np.array([1, 2, 3]) arr = arr * 2 # 快于 for 循环
  1. 数据类型
  • 运算可能改变 dtype
    python arr = np.array([1, 2], dtype=np.int32) result = arr / 2 print(result.dtype) # 输出:float64
  1. 轴(axis)指定
  • 统计或连接操作需明确轴:
    python arr = np.array([[1, 2], [3, 4]]) print(np.sum(arr, axis=0)) # 按列求和:[4 6]

五、最佳实践

  1. 向量化优先
  • 使用 NumPy 内置函数和广播:
    python arr = np.array([[1, 2], [3, 4]]) arr = arr + 1 # 高效
  1. 检查形状
  • 操作前确认 shape
    python print(arr.shape)
  1. 优化内存
  • 使用视图(如 ravel)而非副本(如 flatten):
    python flat = arr.ravel()
  1. 显式数据类型
  • 指定 dtype 避免意外转换:
    python arr = np.array([1, 2], dtype=np.float32)
  1. 结合其他库
  • 与 Pandas、Matplotlib 集成:
    python import pandas as pd df = pd.DataFrame(arr) print(df.mean(axis=0))
  1. 调试输出
  • 使用 np.set_printoptions 控制显示:
    python np.set_printoptions(precision=2)

六、总结

NumPy 的数组操作包括形状调整(reshapeflatten)、数学运算(元素级、矩阵运算)、统计函数(meanstd)、排序(sort)和连接/分割(vstacksplit)。这些操作高效、灵活,适合多维数据处理。遵循最佳实践(如向量化、检查形状、优化内存),并注意视图与副本、形状匹配等问题,能提升代码效率和可靠性。

如果你需要更复杂的示例(如多维运算、性能优化)或特定场景的代码,请告诉我!

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注