Skip to main content

用于高性能计算的算子和求解器。

项目描述

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 通信

项目详情