在循环中调用lambdify,避免显式调用。

3

我有这段代码:

var = ['a','b','c']
arr = np.array([ [1,2,3,4,5,6,7,8,9],
        [0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9]
      ])

y = np.hsplit(arr,len(var))

newdict = {}
for idx,el in enumerate(y):
    newdict[str(var[idx])] = el

print(newdict)

我将数组拆分为3个新的数组,每个数组对应var列表中的一个变量。

然后,我创建了一个新的字典,将每个变量与相应的数组进行关联。现在,我的结果是:

{'a': array([[ 1. ,  2. ,  3. ],
       [ 0.1,  0.2,  0.3]]), 'b': array([[ 4. ,  5. ,  6. ],
       [ 0.4,  0.5,  0.6]]), 'c': array([[ 7. ,  8. ,  9. ],
       [ 0.7,  0.8,  0.9]])}

现在,我有一个要评估的表达式:
expr = sympify('a + b +c')
f = lambdify(var, expr, 'numpy')

result = f(newdict['a'], newdict['b'], newdict['c'])

print(result)

我正在使用lambdify,我收到了正确的结果:

[[ 12.   15.   18. ]
 [  1.2   1.5   1.8]]

我的问题是如何避免明确调用 f(newdict ['a'],newdict ['b'],newdict ['c'])

如何在循环中使用 lambdify?


不必使用 for-loop,可以通过 newdict = dict(zip(var, y)) 来定义 newdict - unutbu
@unutbu:嗯,不错!谢谢! - George
1个回答

4

对于您特定的可交换函数(a + b + c):

f(*newdict.values())

对于非交换函数,需要指定键的顺序(因为字典中的键是无序的),例如:

f(*[v for _, v in sorted(newdict.items())])

使用显式键:

f(*[newdict[k] for k in 'abc'])

使用OrderedDict

from collections import OrderedDict
newdict = OrderedDict()
for idx,el in enumerate(y):
    newdict[str(var[idx])] = el

f(*newdict.values())

(f(*[1, 2, 3]) 相当于 f(1, 2, 3)。)


你还可以写成 f = lambdify((var,), expr, 'numpy'),然后像这样调用它 f(args)(不需要使用 *)。 - asmeurer
@asmeurer:我可以问你个问题吗?如果我有这个字典new_dict = {'a': np.array([1, 2, 3, 4]), 'b': np.array([5, 6, 7, 8])},并使用print(f([v for v in sorted(new_dict.items())])),它会给我:TypeError: cannot determine truth value of Relational。有什么想法吗?谢谢!(我同时发送了评论) - George
您不能直接对SymPy对象进行排序。您需要向sorted传递一个排序键(其中一个选项是key=sympy.default_sort_key)。 - asmeurer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接