用于高性能计算的算子和求解器。
项目描述
PyOperators
PyOperators 包定义了高性能计算的算子和求解器。这些运算符是具有优化和受控内存管理的多维函数。如果是线性的,它们的行为就像具有稀疏存储空间的矩阵。
文档
https://pchanial.github.io/pyoperators
安装
pip install pyoperators[fft,wavelets]
在某些平台上,预先通过 Conda 安装 pyfftw 以使用FFTOperator:
conda install pyfftw
对于 MPI 通信,需要安装 MPI 库,例如在 Ubuntu 上:
sudo apt install libopenmpi-dev
pip install pyoperators[fft,wavelets,mpi]
入门
要定义一个运算符,需要定义一个直接函数来代替通常的矩阵向量运算:
>>> def f(x, out):
... out[...] = 2 * x
然后,您可以实例化一个Operator:
>>> A = pyoperators.Operator(direct=f, flags='symmetric')
定义运算符的另一种方法是定义子类:
>>> from pyoperators import flags, Operator
... @flags.symmetric
... class MyOperator(Operator):
... def direct(x, out):
... out[...] = 2 * x
...
... A = MyOperator()
此运算符没有明确的形状,它可以处理任何形状的输入:
>>> A(np.ones(5))
array([ 2., 2., 2., 2., 2.])
>>> A(np.ones((2,3)))
array([[ 2., 2., 2.],
[ 2., 2., 2.]])
通过设置symmetric标志,我们确保 A 的转置为 A:
>>> A.T is A
True
对于非显式形状算子,我们通过指定输入形状得到对应的稠密矩阵:
>>> A.todense(shapein=2)
array([[2, 0],
[0, 2]])
运算符不必是线性的。许多运算符已经预定义,例如 the DiagonalOperator、 theFFTOperator或非线性ClipOperator。
前面的A矩阵可以像这样更容易地定义:
>>> from pyoperators import I
>>> A = 2 * I
哪里I是没有明确形状的恒等运算符。
运算符可以通过加法、元素乘法或合成组合在一起。请注意,*如果两个运算符是线性的,则运算符代表矩阵乘法,否则代表逐元素乘法:
>>> from pyoperators import I, DiagonalOperator
>>> B = 2 * I + DiagonalOperator(range(3))
>>> B.todense()
array([[2, 0, 0],
[0, 3, 0],
[0, 0, 4]])
代数规则可以很容易地附加到运算符上。它们用于简化表达式以加快执行速度。操作员已B缩减为:
>>> B
DiagonalOperator(array([2, ..., 4], dtype=int64), broadcast='disabled', dtype=int64, shapein=3, shapeout=3)
许多简化是可用的。例如:
>>> from pyoperators import Operator
>>> C = Operator(flags='idempotent,linear')
>>> C * C is C
True
>>> D = Operator(flags='involutary')
>>> D(D)
IdentityOperator()
要求
- 蟒蛇3.8
可选要求:
- PyWavelets:小波变换
- pyfftw:快速傅里叶变换
- mpi4py:用于 MPI 通信