【水了一篇】Scipy简单介绍

2022-09-13 15:15:54 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

文章目录

  • 1 简介
  • 2 常量模块
  • 3 优化器
  • 4 稀疏矩阵
  • 5 图结构
  • 6 空间数据

1 简介

Scipy是基于Numpy的科学计算库,用于数学、科学、工程学等领域,很多有一些高阶抽象和物理模型需要使用Scipy。SciPy包含的模块有最优化、线性代数、积分、插值、特殊函数、快速傅里叶变换、信号处理和图像处理、常微分方程求解和其他科学与工程中常用的计算。

使用之前需要正确安装scipy模块,我使用的是anaconda的jupyter notebook,已内置scipy,不需要再进行安装。示例代码如下:

代码语言:javascript复制
>>> from scipy import constants
>>> print(constants.acre) #输出一英亩为多少平方米
4046.8564223999992

以下列出了SciPy常用的一些模块:

模块名

功能

scipy.cluster

向量量化

scipy.constants

数学常量

scipy.fft

快速傅里叶变换

scipy.integrate

积分

scipy.interpolate

插值

scipy.io

数据输入输出

scipy.linalg

线性代数

scipy.misc

图像处理

scipy.ndimage

N维图像

scipy.odr

正交距离回归

scipy.optimize

优化算法

scipy.signal

信号处理

scipy.sparse

稀疏矩阵

scipy.spatial

空间数据结构和算法

scipy.special

特殊数学函数

scipy/stats

统计函数


2 常量模块

SciPy常量模块constants提供了许多内置的数学常数。以下实例输出圆周率:

代码语言:javascript复制
>>> from scipy import constants
>>> constants.pi
3.141592653589793

以下实例输出黄金比例:

代码语言:javascript复制
>>> constants.golden
1.618033988749895

可用dir()函数来查看constants模块包含了哪些常量:

代码语言:javascript复制
>>> dir(constants)
['Avogadro', 'Boltzmann', 'Btu', 'Btu_IT', 'Btu_th', 'ConstantWarning', 'G', 'Julian_year', 'N_A', 'Planck', 'R', 'Rydberg', 'Stefan_Boltzmann', 'Wien', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '_obsolete_constants', 'acre', 'alpha', 'angstrom', 'arcmin', 'arcminute', 'arcsec', 'arcsecond', 'astronomical_unit', 'atm', 'atmosphere', 'atomic_mass', 'atto', 'au', 'bar', 'barrel', 'bbl', 'blob', 'c', 'calorie', 'calorie_IT', 'calorie_th', 'carat', 'centi', 'codata', 'constants', 'convert_temperature', 'day', 'deci', 'degree', 'degree_Fahrenheit', 'deka', 'dyn', 'dyne', 'e', 'eV', 'electron_mass', 'electron_volt', 'elementary_charge', 'epsilon_0', 'erg', 'exa', 'exbi', 'femto', 'fermi', 'find', 'fine_structure', 'fluid_ounce', 'fluid_ounce_US', 'fluid_ounce_imp', 'foot', 'g', 'gallon', 'gallon_US', 'gallon_imp', 'gas_constant', 'gibi', 'giga', 'golden', 'golden_ratio', 'grain', 'gram', 'gravitational_constant', 'h', 'hbar', 'hectare', 'hecto', 'horsepower', 'hour', 'hp', 'inch', 'k', 'kgf', 'kibi', 'kilo', 'kilogram_force', 'kmh', 'knot', 'lambda2nu', 'lb', 'lbf', 'light_year', 'liter', 'litre', 'long_ton', 'm_e', 'm_n', 'm_p', 'm_u', 'mach', 'mebi', 'mega', 'metric_ton', 'micro', 'micron', 'mil', 'mile', 'milli', 'minute', 'mmHg', 'mph', 'mu_0', 'nano', 'nautical_mile', 'neutron_mass', 'nu2lambda', 'ounce', 'oz', 'parsec', 'pebi', 'peta', 'physical_constants', 'pi', 'pico', 'point', 'pound', 'pound_force', 'precision', 'proton_mass', 'psi', 'pt', 'short_ton', 'sigma', 'slinch', 'slug', 'speed_of_light', 'speed_of_sound', 'stone', 'survey_foot', 'survey_mile', 'tebi', 'tera', 'test', 'ton_TNT', 'torr', 'troy_ounce', 'troy_pound', 'u', 'unit', 'value', 'week', 'yard', 'year', 'yobi', 'yotta', 'zebi', 'zepto', 'zero_Celsius', 'zetta']

常量模块包含以下几种单位:公制单位,二进制,以字节为单位,质量单位,角度换算,时间单位,长度单位,压强单位,体积单位,速度单位,温度单位,能量单位,功率单位,力学单位等。

国际单位制词头:(英语:SI prefix)表示单位的倍数和分数,目前有20个词头,大多数是千的整数次幂。如:

kilo

103

deci

10-1

micro

10-6

centi

10-2

代码语言:javascript复制
>>> constants.kilo
1000.0
>>> constants.deci
0.1
>>> constants.micro
1e-06
>>> constants.centi
0.01

二进制前缀:返回字节单位。如:

kibi

210

mebi

220

gibi

230

代码语言:javascript复制
>>> constants.kibi
1024
>>> constants.mebi
1048576

质量单位:返回多少千克kg。如:

代码语言:javascript复制
>>> constants.gram #1克
0.001
>>> constants.metric_ton #1吨
1000.0
>>> constants.pound #1磅
0.45359236999999997

角度单位:返回弧度。

代码语言:javascript复制
>>> constants.degree #π/180
0.017453292519943295

时间单位:返回秒数。

代码语言:javascript复制
>>> constants.minute
60.0
>>> constants.hour
3600.0

长度单位:返回米数。

代码语言:javascript复制
>>> constants.inch #英寸
0.0254
>>> constants.mile #英里
1609.3439999999998

面积单位:返回多少平方米,平方米是面积的公制单位,其定义是:在一平面上,边长为一米的正方形之面积。

代码语言:javascript复制
>>> constants.acre #英亩
4046.8564223999992
>>> constants.hectare #公顷
10000.0

体积单位:返回多少立方米,立方米是容量计量单位,1立方米的容量相当于一个长、宽、高都等于1米的立方体的体积。

代码语言:javascript复制
>>> constants.gallon #加仑
0.0037854117839999997

速度单位:返回每秒多少米。 #音速

代码语言:javascript复制
>>> constants.speed_of_sound
340.5

3 优化器

SciPy的optimize模块提供了常用的最优化算法函数实现,可以直接调用这些函数完成某些优化问题,比如查找函数的最小值或方程的根等。NumPy能够找到多项式和线性方程的根,但它无法找到非线性方程的根,如x cos(x)。可以使用SciPy的optimze.root函数,这个函数需要两个参数:

  • fun-表示方程的函数。
  • x0-根的初始猜测。

该函数返回一个对象,其中包含有关解决方案的信息。实际解决方案在返回对象的属性x,查看如下实例,查找x cos(x)方程的根:

代码语言:javascript复制
>>> from scipy.optimize import root
>>> from math import cos
>>> def eqn(x):
...     return x cos(x)
...
>>> myroot=root(eqn,0)
>>> myroot.x
array([-0.73908513])
>>> myroot
    fjac: array([[-1.]])
     fun: array([0.])
 message: 'The solution converged.'
    nfev: 9
     qtf: array([-2.66786593e-13])
       r: array([-1.67361202])
  status: 1
 success: True
       x: array([-0.73908513])

可以使用scipy.optimize.minimize()函数来最小化函数,这里不详细介绍,请看这里。


4 稀疏矩阵

稀疏矩阵(英语:sparse matrix)指的是在数值分析中绝大多数数值为零的矩阵。反之,如果大部分元素都非零,则这个矩阵是稠密的(Dense)。

上述稀疏矩阵仅包含9个非零元素,另外包含26个零元。SciPy的scipy.sparse模块提供了处理稀疏矩阵的函数。主要使用以下两种类型的稀疏矩阵:

  • CSC-压缩稀疏列(Compressed Sparse Column),按列压缩。
  • CSR-压缩稀疏行(Compressed Sparse Row),按行压缩。

本节主要使用CSR矩阵。通过向scipy.sparse.csr_matrix()函数传递数组来创建一个CSR矩阵:

代码语言:javascript复制
>>> import numpy as np
>>> from scipy.sparse import csr_matrix
>>> arr=np.array([0,0,0,0,0,1,1,0,2])
>>> print(csr_matrix(arr))
  (0, 5)        1
  (0, 6)        1
  (0, 8)        2

结果解析:

第一行:在矩阵第一行(索引值0)第六(索引值5)个位置有一个数值1。 第二行:在矩阵第一行(索引值0)第七(索引值6)个位置有一个数值1。 第三行:在矩阵第一行(索引值0)第九(索引值8)个位置有一个数值2。

用data属性查看存储的数据(不含0元素):

代码语言:javascript复制
>>> arr=np.array([[0,0,0],[0,0,1],[1,0,2]])
>>> arr
array([[0, 0, 0],
       [0, 0, 1],
       [1, 0, 2]])
>>> csr_matrix(arr).data
array([1, 1, 2], dtype=int32)

用count_nonzero()方法计算非0元素的总数:

代码语言:javascript复制
>>> arr=np.array([[0,0,0],[0,0,1],[1,0,2]])
>>> csr_matrix(arr).count_nonzero()
3

5 图结构

图是各种关系的节点和边的集合,节点是与对象对应的顶点,边是对象之间的连接。SciPy提供了scipy.sparse.csgraph模块来处理图结构。

用scipy模块可以对图使用:

1、dijkstra最短路径算法;

2、floyd算法;

3、bellman ford算法;

4、dfs、bfs算法等图算法。

这里不详细介绍,请看这里。


6 空间数据

空间数据又称几何数据,它用来表示物体的位置、形态、大小分布等各方面的信息,比如坐标上的点。SciPy通过scipy.spatial模块处理空间数据,比如判断一个点是否在边界内、计算给定点周围距离最近点以及给定距离内的所有点。

这里不详细介绍,请看这里。

还有【matlab数组】、【插值】、【显著性检验】,估计用不到,就不整理了。


END

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/153478.html原文链接:https://javaforall.cn

0 人点赞