0

私はよく、配列インデックスが複雑なユーザー指定のセットから生成される多次元配列を扱います。

任意の数のインデックスと任意の複雑な述語を持つ複雑なセットを表すためのクラスを含むライブラリを探しています。セットの説明が与えられた場合、目的の出力はジェネレーターになります。このジェネレータは、多次元配列インデックスに対応するdicts またはs を生成します。tuple

そのようなライブラリは存在しますか?


次のユーザー指定のセット ( set-builder 表記法) があるとします。これは、配列変数のインデックスを表しますx[i][j]

{i in 1..100, j in 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

これが具体的に (set-builder 表記法) が scipy でサポートされているかどうかはわかりませんが。とにかく、scipyが最善の策だと思います。

scipy ではスパース配列/セットがサポートされているため、実際にスペースを割り当てることなく、それらの割り当てを簡単に処理できます:)

于 2012-06-19T23:00:29.653 に答える