Есть ли модуль / рецепт Python (не numpy) для 2d массивов для небольших игр - PullRequest
2 голосов
/ 30 мая 2009

Я пишу несколько небольших игр на Python с Pygame & Pyglet в качестве хобби-проектов.

Класс для 2D-массива был бы очень удобен. Я использую py2exe для отправки игр родственникам / друзьям, и numpy слишком велик, и большинство его функций не нужны для моих требований.

Не могли бы вы предложить модуль / рецепт Python, который я мог бы использовать для этого.

- Чираг

[Изменить]: Список списков может быть использован, как указано ниже MatrixFrog и zvoase. Но это довольно примитивно. Класс с методами для вставки / удаления строк и столбцов, а также для вращения / переворачивания массива сделает его очень простым и пригодным для повторного использования. dicts хороши только для разреженных массивов.

Спасибо за ваши идеи.

Ответы [ 4 ]

6 голосов
/ 30 мая 2009

Как насчет использования 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, ....

3 голосов
/ 30 мая 2009

Самый простой подход - это использовать вложенные списки:

>>> 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)
2 голосов
/ 30 мая 2009

Может быть pyeuclid соответствует вашим потребностям - (датированные, но пригодные для использования) документы имеют формат здесь , современные документы в формате ReST находятся в этот текстовый файл в исходных данных (для самостоятельного форматирования текста ReST используйте documenttils ).

0 голосов
/ 07 августа 2009

Я написал класс. Не знаю, хорошо это или излишне, но ... Размещено здесь http://bitbucket.org/pieceofpeace/container2d/

...