Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在循环中调用lambdify,避免显式调用_Python_Numpy_Sympy - Fatal编程技术网

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())