亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> Python

Python SciPy:科学计算库与函数综合教程

Python SciPy:科学计算库与函数综合教程

Python 中的 SciPy

SciPy 是开源库,在 NumPy 基础上提供解决数学、科学、工程和技术问题的工具。SciPy 构建于 NumPy 之上,为数据操作和可视化提供广泛的高级命令。

子包

本教程涵盖:

为什么使用 SciPy?

NumPy vs SciPy

NumPy

SciPy

安装与环境配置

用 pip 或系统包管理器安装 SciPy:

Python3 -m pip install --user numpy scipy
sudo apt-get install python-scipy python-numpy
sudo port install py35-scipy py35-numpy

脚本中导入 SciPy 和 NumPy:

from scipy import special
import numpy as np

文件 I/O – scipy.io

轻松保存和加载 MATLAB .mat 文件:

import numpy as np
from scipy import io as sio
array = np.ones((4, 4))
sio.savemat('example.mat', {'ar': array})
loaded = sio.loadmat('example.mat', struct_as_record=True)
print(loaded['ar'])

输出:

array([[1., 1., 1., 1.],
       [1., 1., 1., 1.],
       [1., 1., 1., 1.],
       [1., 1., 1., 1.]])

特殊函数 – scipy.special

常用特殊函数示例:

线性代数 – scipy.linalg

计算行列式、逆、特征值和特征向量:

from scipy import linalg
import numpy as np
A = np.array([[4,5],[3,2]])
print(linalg.det(A))  # -7.0
print(linalg.inv(A))  # 逆矩阵
vals, vecs = linalg.eig(A)
print(vals)
print(vecs)

输出:

-7.0
array([[-0.28571429, 0.71428571],
       [ 0.42857143, -0.57142857]])
[ 9.+0.j -1.+0.j]
[[ 0.70710678 -0.5547002 ]
 [ 0.70710678 0.83205029]]

离散傅里叶变换 – scipy.fftpack

变换正弦波并可视化频谱:

%matplotlib inline
from matplotlib import pyplot as plt
import numpy as np
from scipy import fftpack
freq = 5
sample_rate = 50
t = np.linspace(0, 2, 2 * sample_rate, endpoint=False)
wave = np.sin(freq * 2 * np.pi * t)
plt.plot(t, wave)
plt.xlabel('Time (s)'); plt.ylabel('Amplitude')
plt.show()
A = fftpack.fft(wave)
frequency = fftpack.fftfreq(len(wave)) * sample_rate
plt.stem(frequency, np.abs(A))
plt.xlabel('Frequency (Hz)')
plt.ylabel('Magnitude')
plt.xlim(-sample_rate/2, sample_rate/2)
plt.ylim(0, 110)
plt.show()

优化 – scipy.optimize

用 BFGS 寻找标量函数最小值,用盆地跳跃全局搜索:

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from scipy import optimize
def func(a):
    return a*2 + 20*np.sin(a)
plt.plot(np.linspace(-10, 10, 400), func(np.linspace(-10, 10, 400)))
plt.show()
min_bfgs = optimize.fmin_bfgs(func, 0)
print('BFGS result:', min_bfgs)
min_basin = optimize.basinhopping(func, 0)
print('Basin-hopping result:', min_basin.x)

输出显示 BFGS 找到的局部最小值和盆地跳跃确认的全局最优。

Nelder-Mead 算法

无梯度信息的简单无约束最小化:

from scipy.optimize import minimize
def f(x):
    return 0.4*(1 - x[0])**2
res = minimize(f, [2, -1], method='Nelder-Mead')
print('Result:', res.x, 'Function value:', res.fun)

图像处理 – scipy.ndimage

操作图像:显示、翻转、旋转、应用滤波器。

from scipy import ndimage, misc
from matplotlib import pyplot as plt
panda = misc.face()
plt.imshow(panda)
plt.title('Original')
plt.show()
flip_down = np.flipud(panda)
plt.imshow(flip_down)
plt.title('Flip Down')
plt.show()
rotated = ndimage.rotate(panda, 135)
plt.imshow(rotated)
plt.title('Rotated 135°')
plt.show()

数值积分 – scipy.integrate

单重和二重积分带自动误差估计:

from scipy import integrate
# 0 到 1 的 x^2 单重积分
single = integrate.quad(lambda x: x**2, 0, 1)
print('Single integral:', single)
# 三角域上 64*x*y 二重积分
double = integrate.dblquad(lambda x, y: 64*x*y, 0, 2/4,
                           lambda x: 0, lambda y: (1 - 2*y**2)**0.5)
print('Double integral:', double)

均返回元组:(值, 估计误差)。

总结

SciPy 扩展 NumPy 提供完整科学计算栈,含线性代数、优化、统计、信号处理、图像操作。其丰富子包和强大社区支持使其成为研究者和工程师不可或缺的工具。

包名描述
scipy.ioMATLAB、CSV、NetCDF 等文件输入输出
scipy.special特殊数学函数(贝塞尔、伽马等)
scipy.linalg高级线性代数例程
scipy.interpolate插值方法
scipy.optimize优化与曲线拟合工具
scipy.stats统计分布与随机数生成
scipy.integrate数值积分(quad、dblquad 等)
scipy.fftpack快速傅里叶变换
scipy.signal信号处理工具
scipy.ndimage多维图像处理

Python

  1. 精通C标准库函数:实战指南
  2. Python print() 函数完全指南:基础用法、空行打印与自定义结束符
  3. Python str.count() 完全指南:统计字符与子串出现次数实战
  4. Python format() 字符串格式化完全指南:占位符、格式化规范、类与字典应用
  5. Python 字符串 find() 方法完全指南:语法、参数、替代方案与计数技巧
  6. 精通 Python Lambda 函数:实用示例与最佳实践
  7. Python abs() 函数:计算数字与复数的绝对值
  8. Python round() 函数详解与实战示例
  9. 精通 Python map() 函数:语法、示例与最佳实践
  10. Python timeit():精准测量代码执行时间与实战示例
  11. 精通 Python yield:生成器 vs return 实战指南
  12. 理解 Python type() 与 isinstance():实战示例详解