首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lambda在containers上的操作

Lambda在containers上的操作
EN

Stack Overflow用户
提问于 2014-09-04 23:38:09
回答 1查看 93关注 0票数 1

我想在渐变中做一些类似以下的事情:

代码语言:javascript
复制
 `In [1]: from sympy import symbols, Lambda     In [2]: from sympy.core.containers import Dict     In [3]: x, y = symbols('x y')     In [4]: d = Dict({1:x, 2:y})     In [5]: f = Lambda(d, d[1] + d[2])     In [6]: f({1:10, 2:20})     Out[6]: 30`

然而,似乎渐近的lambdas只能在符号上操作,而不能在容器上操作。这个是可能的吗?如果是这样,我该怎么做呢?

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2014-09-06 04:11:44

要制作一个Lambda,你需要一些未评估的东西。d[1]会立即计算出Dict的值(x)。

据我所知,SymPy中还没有这样的对象。IndexedBase是最接近的,但它应该索引到有序的容器中,并且无论如何都不能真正替换一个确切的容器。

这里有一件简单的事情似乎是可行的。我不太确定UnevaluatedDict中的求值逻辑是否正确。此外,我没有更改UnevaluatedDict上的打印机,使其打印为d[1]而不是UnevaluatedDict(d, 1)。请注意,我必须使用一些技巧来使SymPy和Python不认为UnevaluatedDictBase是可迭代的(否则将尝试执行for i in d并陷入无限循环)。

这些东西可能还有更好的名字(实际上IndexedBase应该是这样工作的)。

代码语言:javascript
复制
from sympy.core.compatibility import NotIterable

class UnevaluatedDictBase(Symbol, NotIterable):
    def __getitem__(self, item):
        return UnevaluatedDict(self, item)
        def __iter__(self):
            raise TypeError("UnevaluatedDictBase is not iterable")

class UnevaluatedDict(Expr):
    def __new__(cls, d, item):
        if hasattr(d, '__getitem__') and not isinstance(d, UnevaluatedDictBase):
            return d[item]
        return super(UnevaluatedDict, cls).__new__(cls, d, item)

它的工作原理如下

代码语言:javascript
复制
In [35]: d = UnevaluatedDictBase('d')

In [36]: d[1]
Out[36]: UnevaluatedDict(d, 1)

In [37]: d[1].subs(d, {1: x})
Out[37]: x

In [61]: Lambda(d, d[1] + d[2])
Out[61]: d ↦ UnevaluatedDict(d, 1) + UnevaluatedDict(d, 2)

In [64]: l = Lambda(d, d[1] + d[2])

In [65]: l({1: x, 2: y})
Out[65]: x + y
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25669581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档