2

我正在用 Python 编写一些使用 Pygame 和 Pyglet 作为爱好项目的小游戏。

二维数组的类会非常方便。我使用 py2exe 将游戏发送给亲戚/朋友,而 numpy 太大了,它的大部分功能对我的要求来说是不必要的。

你能推荐一个我可以用来做这个的 Python 模块/食谱吗?

——奇拉格

[编辑]:MatrixFrog 和 zvoase 如下所述,可以使用列表列表。但它非常原始。具有插入/删除行和列以及旋转/翻转数组的方法的类也将使其非常容易和可重用。dicts 仅适用于稀疏数组。

谢谢你的想法。

4

4 回答 4

6

使用默认字典怎么样?

>>> 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'

或者,如果您要处理稀疏矩阵(即具有大量空值或零值的矩阵),使用嵌套字典可能更有效。在这种情况下,您可以实现对矩阵进行操作的 setter 和 getter 函数,如下所示:

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 回答