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时,我收到一个错误.
您能举例说明如何解决这个问题,或者提出一些不同的方法.鉴于向量存储在字典中,公式是字符串输入.
我也可以将变量存储在任何其他容器中.问题是我在执行代码之前不知道变量和公式的名称(它们是由用户提供的).
另外我认为迭代遍历向量中的每个元素可能会很慢,因为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)
将字典传递给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)
| 归档时间: |
|
| 查看次数: |
6037 次 |
| 最近记录: |