用于高性能计算的运算符和求解器。
pyoperators的Python项目详细描述
pyoperators包定义了用于高性能计算的运算符和求解器。这些运算符是多维函数,具有优化和控制的内存管理。如果是线性的,则它们的行为类似于具有稀疏存储空间的矩阵。
更多文档可以在这里找到:http://pchanial.github.io/pyoperators。
开始
要定义运算符,需要定义一个直接函数 它将取代通常的矩阵向量运算:
>>> 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]])
运算符不必是线性的。许多运算符已经是predefined,例如IdentityOperator、DiagonalOperator或非线性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()
要求
要求列表:
- Python2.6
- numpy>;=1.6
- scipy=0.9
可选要求:
- numexpr(>;=2.0更好)
- pywavelts:小波变换