0

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

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

有这样的图书馆吗?


例子

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

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

我想将它放入某种惰性类(可能是生成器表达式)中,这将允许我惰性地评估集合的元素以生成我的数组的索引。假设这个类被调用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}

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

4

2 回答 2

2

这对我来说更像是一个约束求解器问题:

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)
于 2012-06-19T23:21:51.413 回答
0

虽然我不确定 scipy 是否特别支持这一点(set-builder 表示法)。无论如何,我认为 scipy 是你最好的选择。

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

于 2012-06-19T23:00:29.653 回答