Python eval函数与numpy数组通过字典输入与字典

Igo*_*lov 2 python numpy scipy

我在python中实现代码,其中的变量存储在numpy向量中.我需要执行简单的操作:类似于(vec1 + vec2 ^ 2)/ vec3.将每个向量的每个元素求和并相乘.(模拟MATLAB元素.*操作).

问题出在我的代码中,我有字典存储所有向量:

    var = {'a':np.array([1,2,2]),'b':np.array([2,1,3]),'c':np.array([3])}
Run Code Online (Sandbox Code Playgroud)

第3个向量只是1个数字,这意味着我想将这个数字乘以其他数组中的每个元素,如3*[1,2,3].同时我有一个以字符串形式提供的公式:

    formula = '2*a*(b/c)**2'
Run Code Online (Sandbox Code Playgroud)

我正在使用Regexp替换公式:

    formula_for_dict_variables = re.sub(r'([A-z][A-z0-9]*)', r'%(\1)s', formula)
Run Code Online (Sandbox Code Playgroud)

产生结果:

    2*%(a)s*(%(b)s/%(c)s)**2
Run Code Online (Sandbox Code Playgroud)

并替换字典变量:

    eval(formula%var)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我只有纯数字(非numpy数组)一切正常,但当我在dict中放置numpy.arrays时,我收到一个错误.

  1. 您能举例说明如何解决这个问题,或者提出一些不同的方法.鉴于向量存储在字典中,公式是字符串输入.

  2. 我也可以将变量存储在任何其他容器中.问题是我在执行代码之前不知道变量和公式的名称(它们是由用户提供的).

  3. 另外我认为迭代遍历向量中的每个元素可能会很慢,因为python for循环很慢.

unu*_*tbu 11

使用numexpr,你可以这样做:

In [143]: import numexpr as ne
In [146]: ne.evaluate('2*a*(b/c)**2', local_dict=var)
Out[146]: array([ 0.88888889,  0.44444444,  4.        ])
Run Code Online (Sandbox Code Playgroud)


beh*_*uri 6

将字典传递给python eval函数:

>>> var = {'a':np.array([1,2,2]),'b':np.array([2,1,3]),'c':np.array([3])}
>>> formula = '2*a*(b/c)**2'
>>> eval(formula, var)
array([ 0.8889,  0.4444,  4.    ])
Run Code Online (Sandbox Code Playgroud)