Вопрос-Ответ

How to define a two-dimensional array?

Как определить двумерный массив?

Я хочу определить двумерный массив без инициализированной длины следующим образом:

Matrix = [][]

Но это выдает ошибку:


IndexError: индекс списка выходит за пределы диапазона


Переведено автоматически
Ответ 1

Технически вы пытаетесь проиндексировать неинициализированный массив. Вы должны сначала инициализировать внешний список списками, прежде чем добавлять элементы; Python называет это "пониманием списка".

# Creates a list containing 5 lists, each of 8 items, all set to 0
w, h = 8, 5
Matrix = [[0 for x in range(w)] for y in range(h)]

# Теперь вы можете добавлять элементы в список:

Matrix[0][0] = 1
Matrix[6][0] = 3 # error! range...
Matrix[0][6] = 3 # valid

Обратите внимание, что матрица имеет основной адрес "y", другими словами, "индекс y" предшествует "индексу x".

print Matrix[0][0] # prints 1
x, y = 0, 6
print Matrix[x][y] # prints 3; be careful with indexing!

Хотя вы можете называть их как хотите, я смотрю на это так, чтобы избежать некоторой путаницы, которая может возникнуть при индексации, если вы используете "x" как для внутреннего, так и для внешнего списков и хотите получить неквадратичную матрицу.

Ответ 2

Если вам действительно нужна матрица, возможно, вам лучше использовать numpy. Матричные операции в numpy чаще всего используют тип массива с двумя измерениями. Существует множество способов создания нового массива; одним из наиболее полезных является zeros функция, которая принимает параметр shape и возвращает массив заданной формы со значениями, инициализированными нулем:

>>> import numpy
>>> numpy.zeros((5, 5))
array([[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.]])

Вот несколько других способов создания двумерных массивов и матриц (с удалением выходных данных для компактности):

numpy.arange(25).reshape((5, 5))         # create a 1-d range and reshape
numpy.array(range(25)).reshape((5, 5)) # pass a Python range and reshape
numpy.array([5] * 25).reshape((5, 5)) # pass a Python list and reshape
numpy.empty((5, 5)) # allocate, but don't initialize
numpy.ones((5, 5)) # initialize with ones

numpy также предоставляет matrix тип, но он больше не рекомендуется для любого использования и может быть удален из numpy в будущем.

Ответ 3

Вот более краткое обозначение для инициализации списка списков:

matrix = [[0]*5 for i in range(5)]

К сожалению, сокращение этого до чего-то вроде 5*[5*[0]] на самом деле не работает, потому что в итоге вы получаете 5 копий одного и того же списка, поэтому, когда вы изменяете один из них, все они меняются, например:

>>> matrix = 5*[5*[0]]
>>> matrix
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
>>> matrix[4][4] = 2
>>> matrix
[[0, 0, 0, 0, 2], [0, 0, 0, 0, 2], [0, 0, 0, 0, 2], [0, 0, 0, 0, 2], [0, 0, 0, 0, 2]]
Ответ 4

Если вы хотите создать пустую матрицу, правильный синтаксис будет следующим

matrix = [[]]

А если вы хотите сгенерировать матрицу размером 5, заполненную 0,

matrix = [[0 for i in xrange(5)] for i in xrange(5)]
python list