对于我正在进行的数值计算,我需要定义一个大的刘维利矩阵。我没有逐个元素地对它进行编程,这既繁琐又容易出错,我使用 Sympy 以代数方式构造它,然后使用它lambdify
来制作用于数值工作的 numpy 矩阵。这适用于小任务,但是当我使用IPython.parallel
.
例如,在这里,我构造了一个没有任何意义的愚蠢的 sympy 矩阵:
import sympy as s
from sympy.abc import x,y
s.init_printing()
element = lambda n, m : m * x**n if (n+m) % 3 else y
L = s.Matrix([[element(n,m) for m in range(9)] for n in range(9)])
在本例中,我可以直接使用相同的嵌套循环构造一个 numpy 矩阵,但在我的实际问题中,矩阵并非如此。无论如何,在插入数字之前,很高兴看到它以代数符号写出来。
我用来lambdify
为我的数值工作获取一个 Numpy 矩阵:
numer_L = s.lambdify((x,y), L, 'numpy')
numer_L(3,4) # gives numpy matrix for x=3, y=4
假设我想做一个涉及该矩阵(例如行列式)的计算,该矩阵以 的多个值进行评估y
:
# in series
import numpy
s_result = list(map(lambda y: numpy.linalg.det(numer_L(3,y)), range(30)))
这个例子并不昂贵,但如果是这样,我会像这样分配任务:
# set up parallel environment. 2 engines started with `ipcluster start -n 2`
from IPython.parallel import Client
rc = Client()
dview = rc[:]
# in parallel
# do imports and push our lambda function over
dview.execute('import numpy')
dview.push(dict(numer_L=numer_L))
p_result = dview.map_sync(lambda y: numpy.linalg.det(numer_L(3,y)), range(30))
我收到以下错误:
[0:apply]:
---------------------------------------------------------------------------
NameError Traceback (most recent call last)<string> in <module>()
<ipython-input-5-1f431230550c> in <lambda>(y)
/Users/tkb/.virtualenvs/sympy/lib/python2.7/site-packages/numpy/__init__.pyc in <lambda>(x, y)
NameError: global name 'ImmutableMatrix' is not defined
[1:apply]:
---------------------------------------------------------------------------
NameError Traceback (most recent call last)<string> in <module>()
<ipython-input-5-1f431230550c> in <lambda>(y)
/Users/tkb/.virtualenvs/sympy/lib/python2.7/site-packages/numpy/__init__.pyc in <lambda>(x, y)
NameError: global name 'ImmutableMatrix' is not defined
这不起作用,因为显然需要ImmutableMatrix
定义 lambda 函数,这是我从未听说过的,甚至不是我们lambdified 的矩阵类型:
type(L) # sympy.matrices.dense.MutableDenseMatrix
无论如何,我不希望我的引擎运行任何 Sympy 代码。我要分发的任务是数值的,而不是代数的,希望lambdify 已经生成了可以独立运行的numpy 代码。
从 sympy 生成可并行化的 numpy 代码的正确方法是什么?
版本
这是使用 Python 2.7.3、IPython 1.1.0、Sympy 0.7.4.1 和 Numpy 1.8.0 完成的。我用来写这个问题的笔记本可以在nbviewer上访问。