当前位置:首页 > Python > 正文

NumPy数组完全指南:Python科学计算的核心 | Python教程

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是进行高效数据分析和科学计算的第一步!

发表评论