Python 在循环中调用lambdify,避免显式调用
我有以下代码:Python 在循环中调用lambdify,避免显式调用,python,numpy,sympy,Python,Numpy,Sympy,我有以下代码: 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) 我正在拆分数组,以
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?对于特定的交换函数(
a+b+c
):
对于非交换函数,需要指定键顺序(因为键在dict中是无序的),例如:
使用显式键:
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)
)而不是使用for循环
,newdict
也可以通过newdict=dict(zip(var,y))
@unutbu:Hmm,很好!谢谢你也可以写f=lambdify((var,),expr,'numpy')
,像f(args)
(没有*
)那样调用它。@asmurer:我能问你点什么吗?如果我有这个新的dict={'a':np.array([1,2,3,4]),'b':np array([5,6,7,8]),并使用print(f([v代表v-in-in-sorted new dict.items()),它给了我:TypeError:无法确定关系的真值。有什么想法吗?谢谢(我同时发送这两条评论)您不能直接对Symphy对象进行排序。您需要将排序键传递给sorted(一个选项是key=sympy.default\u sort\u key
)。
f(*[newdict[k] for k in 'abc'])
from collections import OrderedDict
newdict = OrderedDict()
for idx,el in enumerate(y):
newdict[str(var[idx])] = el
f(*newdict.values())