【问题标题】:Is there a Python library for handling complicated mathematical sets (constructed using mathematical set-builder notation)?是否有用于处理复杂数学集的 Python 库(使用数学集构建器符号构建)?
【发布时间】:2012-06-19 22:48:52
【问题描述】:

我经常使用多维数组,其数组索引是从复杂的用户指定的集合中生成的。

我正在寻找一个库,其中包含用于表示具有任意数量的索引和任意复杂谓词的复杂集合的类。给定一个集合描述,期望的输出将是一个生成器。该生成器将依次生成与多维数组索引相对应的dicts 或tuples。

这样的库存在吗?


示例

假设我们有以下用户指定的集合(在set-builder notation 中),它表示某个数组变量x[i][j] 的索引:

{i 在 1..100, j 在 1..50: i >= 20, j >= 21, 2*(i + j)

我想将其放入某种惰性类(可能是生成器表达式)中,这将允许我惰性地评估集合的元素以生成我的数组的索引。假设这个类被称为lazyset;这将是期望的行为:

>>> S = lazyset("{i in 1..100, j in 1..50: i >= 20, j >= 21, 2*(i+j) <= 100}")
>>> S
<generator object <genexpr> at 0x1f3e7d0>
>>> next(S)
{'i': 20, 'j': 21}
>>> next(S)
{'i': 20, 'j': 22}

我想我可以自己使用生成器表达式,但这似乎是一个已解决的问题。所以我想我会问是否有人遇到过处理这个问题的成熟图书馆(至少在某种程度上)。有这样的图书馆吗?

【问题讨论】:

  • 看看 scipy 和 sympy。

标签: python data-structures set generator lazy-sequences


【解决方案1】:

在我看来,这更像是一个约束求解器问题:

import constraint as c

p = c.Problem()
p.addVariable(0, range(1,101))
p.addVariable(1, range(1,51))
p.addConstraint(lambda i: i >= 20, [0])
p.addConstraint(lambda j: j >= 21, [1])
p.addConstraint(c.MaxSumConstraint(50))

indices = ((s[0], s[1]) for s in p.getSolutionIter())  # convert to tuple generator

如果你这样做了

for ij in indices:
    print ij

你得到

(29, 21)
(28, 22)
(28, 21)
(27, 23)
(27, 22)
(27, 21)

...

(20, 25)
(20, 24)
(20, 23)
(20, 22)
(20, 21)

【讨论】:

  • 这绝对是一个创意!我没有想过使用约束求解器来构建集合。我已经可以在我的代码的其他部分看到 python-constraint 的应用程序。但是,我只是想知道,是否有更轻量级的方法可以做到这一点,因为我只是想遍历索引,然后根据所有谓词检查每个索引;如果特定索引满足所有谓词,则接受它,否则拒绝它。我只是想知道约束求解器算法是否会减少这种情况。无论哪种方式,这是一个非常有创意的想法!
  • @Gilead:constraint 将在定义所需变量后立即评估每个约束;在最坏的情况下(所有约束都取决于所有变量),这正是它所简化的。
【解决方案2】:

虽然我不确定 scipy.无论如何,我认为 scipy 是你最好的选择。

scipy 支持稀疏数组/集合,因此您可以轻松地让它处理那些分配,而无需实际分配空间:)

【讨论】:

  • 感谢您的意见,这当然是我没有想到的选项!但是,我正在考虑使用生成器,因为我不打算存储这些索引。我只想要一个可以循环运行for 的可迭代对象。
猜你喜欢
  • 2019-04-04
  • 1970-01-01
  • 2020-01-24
  • 2016-11-01
  • 1970-01-01
  • 2017-04-20
  • 2012-10-19
  • 2020-03-16
  • 2010-12-24
相关资源
最近更新 更多