2

趣味のプロジェクトとして、Pygame と Pyglet を使用して Python でいくつかの小さなゲームを作成しています。

2D 配列のクラスは非常に便利です。私は py2exe を使用してゲームを親戚/友人に送信していますが、numpy は大きすぎて、その機能のほとんどは私の要件には不要です。

これに使用できる Python モジュール/レシピを提案していただけますか。

-- チラグ

[編集]: リストのリストは、MatrixFrog と zvoase で後述のように使用できます。しかし、それはかなり原始的です。行と列を挿入/削除し、配列を回転/反転するメソッドを持つクラスは、非常に簡単で再利用可能になります。dicts はスパース配列にのみ適しています。

アイデアありがとうございます。

4

4 に答える 4

6

defaultdict を使用するのはどうですか?

>>> import collections
>>> Matrix = lambda: collections.defaultdict(int)
>>> m = Matrix()
>>> m[3,2] = 6
>>> print m[3,4]   # deliberate typo :-)
0
>>> m[3,2] += 4
>>> print m[3,2]
10
>>> print m
defaultdict(<type 'int'>, {(3, 2): 10, (3, 4): 0})

基になる dict はタプルをキーとして使用するため、これは 1D、2D、3D、... 行列をサポートします。

于 2009-05-30T08:48:39.123 に答える
3

最も簡単な方法は、ネストされたリストを使用することです。

>>> matrix = [[0] * num_cols] * num_rows
>>> matrix[i][j] = 'value' # row i, column j, value 'value'
>>> print repr(matrix[i][j])
'value'

あるいは、スパース行列 (つまり、空の値またはゼロの値が多数ある行列) を扱う場合は、ネストされた辞書を使用する方が効率的かもしれません。この場合、次のように、マトリックスで動作するセッター関数とゲッター関数を実装できます。

def get_element(mat, i, j, default=None):
    # This will also set the accessed row to a dictionary.
    row = mat.setdefault(i, {})
    return row.setdefault(j, default)

def set_element(mat, i, j, value):
    row = mat.setdefault(i, {})
    row[j] = value

そして、次のように使用します。

>>> matrix = {}
>>> set_element(matrix, 2, 3, 'value') # row 2, column 3, value 'value'
>>> print matrix
{2: {3: 'value'}}
>>> print repr(get_element(matrix, 2, 3))
'value'

必要に応じて、これらのメソッドを実装したクラスを実装できますが、Matrixそれはやり過ぎかもしれません。

class Matrix(object):
    def __init__(self, initmat=None, default=0):
        if initmat is None: initmat = {}
        self._mat = initmat
        self._default = default
    def __getitem__(self, pos):
        i, j = pos
        return self._mat.setdefault(i, {}).setdefault(j, self._default)  
    def __setitem__(self, pos, value):
        i, j = pos
        self._mat.setdefault(i, {})[j] = value
    def __repr__(self):
        return 'Matrix(%r, %r)' % (self._mat, self._default)

>>> m = Matrix()
>>> m[2,3] = 'value'
>>> print m[2,3]
'value'
>>> m
Matrix({2: {3: 'value'}}, 0)
于 2009-05-30T08:30:11.940 に答える
2

おそらくpyeuclidはあなたのニーズに合っています -- (日付は付いていますが使用可能な) フォーマットされたドキュメントはここにあります。ReST 形式の最新のドキュメントはpyeuclid ソースのこのテキスト ファイルにあります (ReST テキストを独自にフォーマットするには、 docutilsを使用します)。

于 2009-05-30T17:53:32.313 に答える
0

クラスを書きました。それが良いのか冗長なのかはわかりませんが...ここに投稿しましたhttp://bitbucket.org/pieceofpeace/container2d/

于 2009-08-07T09:56:58.803 に答える