有没有适合小型游戏的Python模块/方法(非numpy)用于二维数组?

2 投票
4 回答
1990 浏览
提问于 2025-04-15 11:56

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

我觉得有一个处理二维数组的类会很方便。我用py2exe把游戏发给亲戚和朋友,但numpy太大了,而且里面很多功能对我来说都没用。

你能推荐一个Python模块或者方法让我用吗?

-- Chirag

[编辑]:

正如MatrixFrog和zvoase提到的,使用列表的列表也可以。但这有点原始。如果有一个类,里面有插入/删除行和列的方法,还能旋转/翻转数组,那就会简单多了,也更容易重复使用。字典只适合稀疏数组。

谢谢你的建议。

4 个回答

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)
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})

因为这个字典的底层使用元组作为键,所以它可以支持一维、二维、三维,甚至更多维度的矩阵。

0

我写了一个类。不知道它好不好或者是不是多余,但... 我把它放在这里了 http://bitbucket.org/pieceofpeace/container2d/

撰写回答