2014-09-13 65 views
1

我正在實現的代碼在Python中有變量存儲在numpy向量。我需要執行簡單的操作:像(vec1 + vec2^2)/ vec3。每個矢量的每個元素相加並相乘。 (MATLAB的元模擬操作)。通過字符串輸入與字典numpy數組Python的eval函數與字典

的問題是在我的代碼我有字典存儲所有矢量是:

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

該第三矢量只有1號,這意味着我想通過在其他陣列樣3的每個元素乘以這個數* [1,2,3]。並且在同一時間我有作爲字符串提供了式:

formula = '2*a*(b/c)**2' 

我使用正則表達式替換式:

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

其產生的結果:

2*%(a)s*(%(b)s/%(c)s)**2 

和替代字典變量:

eval(formula%var) 

在這種情況下,我只是純數字(不是numpy數組),一切正常,但是當我將numpy.arrays放在字典中時,我收到一個錯誤。

  1. 你可以舉個例子,我該如何解決這個問題,或者可能會提出一些不同的方法。鑑於向量存儲在字典中並且公式是字符串輸入。

  2. 我也可以在任何其他容器中存儲變量。問題是我不知道變量和公式在執行代碼之前的名稱(它們是由用戶提供的)。

  3. 此外,我認爲遍歷矢量中的每個元素可能會慢,因爲python for循環很慢。

回答

10

使用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.  ]) 
+0

我接受你的答案,由於它速度更快,這是偉大的束。謝謝 – 2014-09-13 19:13:17

4

把字典蟒蛇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. ])