引言
NumPy(Numerical Python)是Python科学计算的核心库,为高效处理多维数组和矩阵运算提供了强大的支持。无论是数据分析、机器学习还是信号处理,NumPy都是不可或缺的工具。本文将带你系统学习NumPy的核心功能,并通过实例演示其在科学计算中的应用。
一、NumPy数组基础
1.1 数组的概念
NumPy的核心是ndarray
对象(N维数组),它具有以下特点:
-
固定大小:数组创建后大小不可变。
-
同构数据类型:所有元素类型必须一致。
-
高效运算:支持矢量化操作,避免显式循环。
核心术语:
-
维度(Axis):数组的轴代表其维度。例如,二维数组有两个轴(行和列)。
-
秩(Rank):数组的维度数。一维数组的秩为1,二维数组的秩为2。
import numpy as np
# 创建一维、二维、三维数组
arr1d = np.array([1, 2, 3])
arr2d = np.array([[1, 2], [3, 4]])
arr3d = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
1.2 数组的创建
NumPy提供了多种创建数组的方法:
-
从列表/元组创建:
np.array()
-
全零数组:
np.zeros(shape)
-
全一数组:
np.ones(shape)
-
等差数组:
np.arange(start, end, step)
-
指定数据类型:通过
dtype
参数控制元素类型。
# 创建全零数组并指定类型
zero_arr = np.zeros((3, 3), dtype=np.int32)# 创建等差数组
range_arr = np.arange(0, 10, 2) # 输出:[0 2 4 6 8]
二、数组操作与运算
2.1 索引与切片
-
一维数组:与Python列表语法一致。
-
二维数组:通过
[行索引, 列索引]
访问元素。 -
布尔索引:根据条件筛选元素。
arr = np.array([[1, 2, 3], [4, 5, 6]])
# 获取第二行第一列的元素
print(arr[1, 0]) # 输出:4# 布尔索引筛选大于3的元素
print(arr[arr > 3]) # 输出:[4 5 6]
2.2 广播机制
当不同形状的数组进行运算时,NumPy会自动触发广播机制(Broadcasting),将小数组扩展为兼容形状。
广播规则:
-
从右向左对齐维度。
-
每个维度的大小要么相等,要么其中一个为1。
a = np.array([[1, 2], [3, 4]])
b = np.array([10, 20])# 广播后,b被扩展为[[10, 20], [10, 20]]
print(a + b) # 输出:[[11 22], [13 24]]
2.3 通用函数(UFunc)
NumPy提供大量数学函数,支持矢量化运算:
-
一元函数:如
np.sqrt()
(平方根)、np.exp()
(指数)。 -
二元函数:如
np.add()
(加法)、np.multiply()
(乘法)。
arr = np.array([1, 4, 9])
# 计算平方根
print(np.sqrt(arr)) # 输出:[1. 2. 3.]# 矩阵乘法
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
print(np.dot(a, b)) # 输出:[[19 22], [43 50]]
三、高级操作
3.1 数组重塑与转置
-
重塑:
reshape()
改变数组形状,但总元素数不变。 -
转置:
.T
属性或transpose()
方法交换轴顺序。
# 将一维数组重塑为3x2的二维数组
arr = np.arange(6).reshape(3, 2)# 转置数组
print(arr.T) # 输出:[[0 2 4], [1 3 5]]
3.2 统计与逻辑运算
-
统计函数:如
np.sum()
(求和)、np.mean()
(均值)。 -
条件逻辑:
np.where(condition, x, y)
根据条件选择元素。
# 计算每列的最大值
arr = np.array([[1, 2], [3, 4]])
print(np.max(arr, axis=0)) # 输出:[3 4]# 条件替换
print(np.where(arr > 2, 10, 0)) # 输出:[[0 0], [10 10]]
四、实战案例:股票收益率计算
4.1 数据准备
假设某股票连续5天的收盘价为:[100, 102, 105, 103, 107]
。
prices = np.array([100, 102, 105, 103, 107])
4.2 计算简单收益率与对数收益率
# 简单收益率:(当前价格 - 前一日价格) / 前一日价格
simple_returns = (prices[1:] - prices[:-1]) / prices[:-1]# 对数收益率:ln(当前价格 / 前一日价格)
log_returns = np.log(prices[1:] / prices[:-1])
五、总结
NumPy通过高效的数组操作和丰富的数学函数,成为科学计算的基石。掌握其核心功能后,可大幅提升数据处理效率。无论是简单的统计分析,还是复杂的矩阵运算,NumPy都能提供优雅的解决方案。后续可结合Pandas、Matplotlib等库,构建完整的数据分析工作流。