Pregunta Cómo definir una matriz bidimensional en Python


Quiero definir una matriz bidimensional sin una longitud inicializada como esta:

Matrix = [][]

Pero no funciona...

He intentado el código a continuación, pero también está mal:

Matrix = [5][5]

Error:

Traceback ...

IndexError: list index out of range

¿Cuál es mi error?


523
2017-07-12 15:54


origen


Respuestas:


Está técnicamente tratando de indexar una matriz no inicializada. Primero debe inicializar la lista externa con listas antes de agregar elementos; Python llama esto "lista de comprensión".

# 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)] 

Ahora puede agregar elementos a la lista:

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

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

Aunque puede nombrarlos como lo desee, lo veo de esta manera para evitar cierta confusión que podría surgir con la indización, si usa "x" para las listas internas y externas, y desea una matriz no cuadrada.


745
2017-07-12 15:59



Si realmente quieres una matriz, es mejor que uses una matriz numpy. Operaciones de matriz en numpy la mayoría de las veces usa un tipo de matriz con dos dimensiones. Hay muchas formas de crear una nueva matriz; uno de los más útiles es el zeros función, que toma un parámetro de forma y devuelve una matriz de la forma dada, con los valores inicializados a cero:

>>> 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 provee un matrix escriba también. Se usa con menos frecuencia, y algunas personas recomendar contra usándolo Pero es útil para las personas que vienen a numpy de Matlab, y en algunos otros contextos. ¡Pensé incluirlo ya que estamos hablando de matrices!

>>> numpy.matrix([[1, 2], [3, 4]])
matrix([[1, 2],
        [3, 4]])

Aquí hay algunas otras formas de crear matrices y matrices de 2-d (con la salida eliminada por compactación):

numpy.matrix('1 2; 3 4')                 # use Matlab-style syntax
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.ndarray((5, 5))                    # use the low-level constructor

321
2017-07-12 16:04



Aquí hay una notación más corta para inicializar una lista de listas:

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

Lamentablemente acortar esto a algo así como 5*[5*[0]] realmente no funciona porque terminas con 5 copias de la misma lista, por lo que cuando modificas una de ellas todas cambian, por ejemplo:

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

256
2017-07-12 16:17



Si desea crear una matriz vacía, la sintaxis correcta es

matrix = [[]]

Y si quieres generar una matriz de tamaño 5 con 0,

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

74
2017-07-12 16:00



Si todo lo que desea es un contenedor bidimensional para contener algunos elementos, puede usar cómodamente un diccionario en su lugar:

Matrix = {}

Entonces puedes hacer:

Matrix[1,2] = 15
print Matrix[1,2]

Esto funciona porque 1,2 es una tupla, y la está usando como clave para indexar el diccionario. El resultado es similar a una matriz dispersa tonta.

Según lo indicado por osa y Josap Valls, también puedes usar Matrix = collections.defaultdict(lambda:0) para que los elementos faltantes tengan un valor predeterminado de 0.

Vatsal señala además que este método probablemente no sea muy eficiente para matrices grandes y solo debe usarse en partes del código que no sean críticas para el rendimiento.


64
2018-05-29 07:23



En Python, creará una lista de listas. No tiene que declarar las dimensiones antes de tiempo, pero puede hacerlo. Por ejemplo:

matrix = []
matrix.append([])
matrix.append([])
matrix[0].append(2)
matrix[1].append(3)

Ahora matriz [0] [0] == 2 y matriz [1] [0] == 3. También puede usar la sintaxis de comprensión de lista. Este ejemplo lo usa dos veces para crear una "lista bidimensional":

from itertools import count, takewhile
matrix = [[i for i in takewhile(lambda j: j < (k+1) * 10, count(k*10))] for k in range(10)]

34
2017-07-12 16:04



La respuesta aceptada es buena y correcta, pero me tomó un tiempo entender que también podría usarla para crear una matriz completamente vacía.

l =  [[] for _ in range(3)]

resultados en

[[], [], []]

16
2017-12-04 14:13



Debe hacer una lista de listas, y la mejor manera es usar comprensiones anidadas:

>>> matrix = [[0 for i in range(5)] for j in range(5)]
>>> pprint.pprint(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]]

En tu [5][5] Por ejemplo, usted está creando una lista con un número entero "5" dentro, e intenta acceder a su 5º elemento, y eso, naturalmente, provoca un IndexError porque no hay un quinto elemento:

>>> l = [5]
>>> l[5]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range

15
2017-07-12 16:00