【问题标题】:call lambdify in a loop, avoid explicitly call循环调用lambdify,避免显式调用
【发布时间】:2017-03-01 10:07:44
【问题描述】:

我有这个代码:

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-loopnewdict也可以用newdict = dict(zip(var, y))定义。
  • @unutbu:嗯,很好!谢谢!

标签: python numpy sympy


【解决方案1】:

对于您的特定交换函数 (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:我能问你一些事情吗?如果我有这个字典 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:无法确定 Relational.Any 的真值想法?谢谢!(我同时发送评论)
  • 您不能直接对 SymPy 对象进行排序。您需要将排序键传递给 sorted(一个选项是 key=sympy.default_sort_key)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-05
  • 1970-01-01
相关资源
最近更新 更多