Quiero definir una matriz bidimensional sin una longitud inicializada como esta:
Matrix = [][]
Pero no funciona...
He probado el siguiente código, pero también está mal:
Matrix = [5][5]
Error:
Traceback ...
IndexError: list index out of range
Cual es mi error?
python
matrix
syntax-error
Masoud Abasian
fuente
fuente
Respuestas:
Técnicamente está tratando de indexar una matriz no inicializada. Primero debe inicializar la lista externa con listas antes de agregar elementos; Python llama a esto "comprensión de la lista".
Ahora puede agregar elementos a la lista:
Tenga en cuenta que la matriz es la dirección "y" mayor, en otras palabras, el "índice y" viene antes que el "índice x".
Aunque puede nombrarlos como lo desee, lo veo de esta manera para evitar cierta confusión que pueda surgir con la indexación, si usa "x" para las listas internas y externas, y desea una matriz no cuadrada.
fuente
range
para crear las listas internas directamente:[range(5) for x in range(5)]
[0] * w
parte es agradable, pero[[0] * w] * h]
producirá un comportamiento inesperado. Pruebemat = [[0] * 3] * 3; mat[0][1] = 10; print(mat == [[0, 10, 0], [0, 10, 0], [0, 10, 0]])
ymat = [[0] * 3 for i in range(3)]; mat[0][1] = 10; print(mat == [[0, 10, 0], [0, 0, 0], [0, 0, 0]])
.Si realmente quieres una matriz, es mejor que la uses
numpy
. Las operaciones matriciales en lanumpy
mayoría de los casos usan un tipo de matriz con dos dimensiones. Hay muchas formas de crear una nueva matriz; una de las más útiles es lazeros
función, que toma un parámetro de forma y devuelve una matriz de la forma dada, con los valores inicializados a cero:Aquí hay algunas otras formas de crear matrices y matrices en 2-d (con salida eliminada por compacidad):
numpy
también proporciona unmatrix
tipo, pero ya no se recomienda para ningún uso y puede eliminarsenumpy
en el futuro.fuente
np.matrix
para representarla. La forma correcta de representar una matriz en numpy es con unarray
.array
s en lugar de matrices. Si bien no siempre se recomienda, existen razones legítimas para usarmatrix
: el contexto es importante.matrix
? Desde@
que se introdujo el operador, parece haber una razón menos desde que se escribió esta publicación.numpy
documentos ahora indican que la clase puede ser desaprobada y eliminada en el futuro, por lo que la saqué de la respuesta.Aquí hay una notación más corta para inicializar una lista de listas:
Desafortunadamente, acortar esto a algo así
5*[5*[0]]
no funciona realmente porque terminas con 5 copias de la misma lista, por lo que cuando modificas una de ellas, todas cambian, por ejemplo:fuente
[0]*5
?[[0]*5 for _ in range(5)]
con contador de bucle anónimo que no estás usando[0]*5
funciona bien. Ahora entiendo por qué[{0}]*8
sería una mala idea también.Si desea crear una matriz vacía, la sintaxis correcta es
Y si desea generar una matriz de tamaño 5 con 0,
fuente
Si todo lo que desea es un contenedor bidimensional para contener algunos elementos, puede utilizar convenientemente un diccionario en su lugar:
Entonces puedes hacer:
Esto funciona porque
1,2
es una tupla, y la estás usando como clave para indexar el diccionario. El resultado es similar a una matriz dispersa tonta.Como lo indican osa y Josap Valls, también puede usar
Matrix = collections.defaultdict(lambda:0)
para que los elementos faltantes tengan un valor predeterminado de0
.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.
fuente
import collections; Matrix = collections.defaultdict(float)
, para sustituir ceros por elementos no inicializados.En Python crearás una lista de listas. No tiene que declarar las dimensiones con anticipación, pero puede hacerlo. Por ejemplo:
Ahora matriz [0] [0] == 2 y matriz [1] [0] == 3. También puede usar la sintaxis de comprensión de la lista. Este ejemplo lo usa dos veces para construir una "lista bidimensional":
fuente
extend
También sería útil en el primer caso: si comienza conm = [[]]
, entonces podría agregar a la lista interna (extender una fila) conm[0].extend([1,2])
, y agregar a la lista externa (agregar una nueva fila) conm.append([3,4])
, esas operaciones lo dejarían con[[1, 2], [3, 4]]
.La respuesta aceptada es buena y correcta, pero me llevó un tiempo comprender que también podría usarla para crear una matriz completamente vacía.
resultados en
fuente
Debería hacer una lista de listas, y la mejor manera es usar comprensiones anidadas:
En su
[5][5]
ejemplo, está creando una lista con un número entero "5" dentro, e intenta acceder a su quinto elemento, y eso naturalmente genera un IndexError porque no hay un quinto elemento:fuente
¿Por qué un código tan largo que también
Python
preguntas?Hace mucho tiempo, cuando no me sentía cómodo con Python, vi las respuestas de una sola línea para escribir una matriz 2D y me dije a mí mismo que no voy a usar la matriz 2-D en Python nuevamente. (Esas líneas individuales daban bastante miedo y no me dieron ninguna información sobre lo que estaba haciendo Python. También tenga en cuenta que no estoy al tanto de estas shorthands).
De todos modos, aquí está el código para un principiante cuyo origen es C, CPP y Java.
Nota para los amantes y expertos de Python: por favor no voten solo porque escribí un código detallado.
fuente
Una reescritura para una fácil lectura:
fuente
Utilizar:
El * 5 para la primera dimensión funciona porque a este nivel los datos son inmutables.
fuente
matrix = [[0]*cols for _ in range(rows)]
Para declarar una matriz de ceros (unos):
p.ej
o numpy.ones ((x, y)) ej.
Incluso tres dimensiones son posibles. ( http://www.astro.ufl.edu/~warner/prog/python.html ver -> Arreglos multidimensionales)
fuente
Así es como generalmente creo matrices 2D en python.
Encuentro esta sintaxis fácil de recordar en comparación con el uso de dos bucles for en una lista de comprensión.
fuente
Estoy en mi primer script de Python, y estaba un poco confundido con el ejemplo de matriz cuadrada, así que espero que el siguiente ejemplo lo ayude a ahorrar algo de tiempo:
así que eso
fuente
Usando NumPy puedes inicializar una matriz vacía como esta:
Y luego agregue datos como este:
fuente
Leí en archivos separados por comas como este:
La lista "datos" es entonces una lista de listas con datos de índice [fila] [col]
fuente
Si desea poder pensarlo como una matriz 2D en lugar de verse obligado a pensar en términos de una lista de listas (mucho más natural en mi opinión), puede hacer lo siguiente:
El resultado es una lista (no una matriz NumPy), y puede sobrescribir las posiciones individuales con números, cadenas, lo que sea.
fuente
numpy.matrix
equivalentes anumpy.zeros
sin ceros sin ser lista?Eso es lo que el diccionario está hecho el !
Puedes definir claves y valores de dos maneras:
o
Resultado:
fuente
Utilizar:
Creo que NumPy es el camino a seguir. Lo anterior es genérico si no desea usar NumPy.
fuente
mediante el uso de la lista:
mediante el uso de dict: también puede almacenar esta información en la tabla hash para realizar búsquedas rápidas como
matriz ['1'] le dará resultado en O (1) tiempo
* nb : debes lidiar con una colisión en la tabla hash
fuente
Si no tiene información sobre el tamaño antes de comenzar, cree dos listas unidimensionales.
Almacene toda la fila en la primera lista. Una vez hecho esto, agregue la lista 1 a la lista 2:
Salida:
fuente
Tenga cuidado con esta breve expresión, vea la explicación completa en la respuesta de @ FJ
fuente
Matrix[0], Matrix[1], ..., Matrix[4]
todos apuntan a la misma matriz, por lo que despuésMatrix[0][0] = 3
esperaríaMatrix[0][0] == Matrix[1][0] == ... == Matrix[4][0] == 3
.Será más rápido que:
fuente
[[0]*(L) for i in range(W)]
debería ser[[0]*(L) for _ in range(W)]
yai
que no se usa en ninguna partePuede crear una lista bidimensional vacía anidando dos o más arriostramientos cuadrados o tercer corchete (
[]
, separados por comas) con un arriostramiento cuadrado, tal como se muestra a continuación:Ahora suponga que desea agregar 1 y
Matrix[0][0]
luego escribe:Ahora, escribe Matrix y presiona Enter. El resultado será:
fuente
Prueba esto:
fuente
En caso de que necesite una matriz con números predefinidos, puede usar el siguiente código:
fuente
Aquí está el fragmento de código para crear una matriz en python:
Por favor sugiera si me he perdido algo.
fuente