python科学计算:NumPy 数组的高级操作

1 基本数学函数

NumPy 提供了大量的数学函数来执行各种基本运算。这些函数可以作用于数组的每个元素,且支持广播机制。

1.1 三角函数

NumPy 提供了一组常见的三角函数,包括 sin()cos()tan() 及其反函数。

import numpy as np

# 创建一个数组
angles = np.array([0, np.pi/2, np.pi, 3*np.pi/2])

# 计算正弦值
sin_vals = np.sin(angles)
print("正弦值:", sin_vals)

# 计算余弦值
cos_vals = np.cos(angles)
print("余弦值:", cos_vals)

# 计算反正弦值
arcsin_vals = np.arcsin(np.sin(np.pi/6))
print("反正弦值:", arcsin_vals)
1.2 指数和对数函数

NumPy 提供了指数函数 exp() 和对数函数 log(),这些函数对于计算增长率、衰减和缩放非常有用。

# 计算指数
exp_vals = np.exp([1, 2, 3])
print("指数值:", exp_vals)

# 计算自然对数
log_vals = np.log([1, np.e, np.e**2])
print("自然对数:", log_vals)

# 计算以 10 为底的对数
log10_vals = np.log10([1, 10, 100])
print("以 10 为底的对数:", log10_vals)
1.3 幂运算和平方根

NumPy 提供了 power()sqrt() 函数来处理幂运算和求平方根。

# 幂运算
pow_vals = np.power([2, 3, 4], 3)
print("幂运算结果:", pow_vals)

# 计算平方根
sqrt_vals = np.sqrt([4, 9, 16])
print("平方根结果:", sqrt_vals)

2 数组的统计分析

统计分析是数据科学的重要部分,NumPy 提供了多种用于数组统计的函数,包括计算均值、中位数、方差、标准差等。

2.1 均值、中位数和众数
  • 均值: 使用 mean() 函数计算数组的算术平均值。
  • 中位数: 使用 median() 函数计算数组的中间值。
# 创建一个数组
data = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])

# 计算均值
mean_val = np.mean(data)
print("均值:", mean_val)

# 计算中位数
median_val = np.median(data)
print("中位数:", median_val)

众数 并非 NumPy 内置函数,而需要使用 scipy.stats.mode() 来计算。

2.2 方差和标准差
  • 方差: 使用 var() 函数计算数据的方差,反映数据的波动性。
  • 标准差: 使用 std() 函数计算数据的标准差。
# 计算方差
var_val = np.var(data)
print("方差:", var_val)

# 计算标准差
std_val = np.std(data)
print("标准差:", std_val)
2.3 最大值、最小值、极差
  • 最大值: 使用 max() 函数获取数组中的最大值。
  • 最小值: 使用 min() 函数获取数组中的最小值。
  • 极差: 极差是最大值与最小值之间的差值。
# 计算最大值
max_val = np.max(data)
print("最大值:", max_val)

# 计算最小值
min_val = np.min(data)
print("最小值:", min_val)

# 计算极差
range_val = np.ptp(data)
print("极差:", range_val)
2.4 累积和与累积积
  • 累积和: 使用 cumsum() 函数计算数组的累积和。
  • 累积积: 使用 cumprod() 函数计算数组的累积积。
# 计算累积和
cumsum_vals = np.cumsum(data)
print("累积和:", cumsum_vals)

# 计算累积积
cumprod_vals = np.cumprod(data)
print("累积积:", cumprod_vals)

3 随机数生成

在数据模拟、蒙特卡罗模拟等领域,随机数的生成非常重要。NumPy 提供了强大的随机数生成模块 numpy.random,用于生成各种类型的随机数。

3.1 生成随机整数

randint() 函数可以生成指定范围内的随机整数。

# 生成 0 到 10 之间的随机整数
rand_ints = np.random.randint(0, 10, size=5)
print("随机整数:", rand_ints)
3.2 生成随机浮点数

rand()randn() 函数可以生成 0 到 1 之间的随机浮点数或标准正态分布的随机数。

# 生成 0 到 1 之间的随机浮点数
rand_floats = np.random.rand(3, 3)
print("随机浮点数:\n", rand_floats)

# 生成标准正态分布的随机数
rand_norm = np.random.randn(3, 3)
print("正态分布随机数:\n", rand_norm)
3.3 固定随机数种子

为了保证随机数生成的可重复性,可以使用 seed() 函数来固定随机数种子。

# 固定随机数种子
np.random.seed(42)
fixed_rand_ints = np.random.randint(0, 10, size=5)
print("固定种子的随机整数:", fixed_rand_ints)
3.4 洗牌与抽样
  • 洗牌: 使用 shuffle() 函数对数组元素进行随机排列。
  • 抽样: 使用 choice() 函数从数组中随机抽样。
# 创建一个数组
arr = np.arange(10)

# 洗牌
np.random.shuffle(arr)
print("洗牌后的数组:", arr)

# 随机抽样
sample = np.random.choice(arr, size=5, replace=False)
print("随机抽样:", sample)

4 线性代数

NumPy 的 linalg 模块提供了常见的线性代数运算,包括矩阵乘法、矩阵的逆、行列式、特征值和特征向量等。

4.1 矩阵乘法

dot() 函数可以用于矩阵乘法运算,支持二维矩阵之间的乘法以及向量与矩阵之间的乘法。

# 创建两个矩阵
matrix1 = np.array([[1, 2], [3, 4]])
matrix2 = np.array([[5, 6], [7, 8]])

# 进行矩阵乘法
dot_product = np.dot(matrix1, matrix2)
print("矩阵乘法结果:\n", dot_product)
4.2 计算矩阵的逆

inv() 函数用于计算矩阵的逆,要求矩阵是方阵。

from numpy.linalg import inv

# 计算矩阵的逆
matrix_inv = inv(matrix1)
print("矩阵的逆:\n", matrix_inv)
4.3 计算行列式

det() 函数用于计算矩阵的行列式。

from numpy.linalg import det

# 计算行列式
matrix_det = det(matrix1)
print("矩阵的行列式:", matrix_det)
4.4 特征值与特征向量

eig() 函数用于计算矩阵的特征值和特征向量。

from numpy.linalg import eig

# 计算特征值与特征向量
eigenvalues, eigenvectors = eig(matrix1)
print("特征值:", eigenvalues)
print("特征向量:\

n", eigenvectors)