¿Cómo declarar una matriz en Python?

556

¿Cómo declaro una matriz en Python ?

No puedo encontrar ninguna referencia a matrices en la documentación.

9
  • 133
    Por alguna razón insondable, Python llama a las matrices "listas". La escuela de diseño de lenguaje "todo el mundo sabe cómo se llama esto, así que vamos a llamarlo de otra manera". Es una elección de nombre particularmente mala, ya que parece una lista vinculada en lugar de una matriz. Glenn Maynard 3 oct 09 a las 19:11
  • 44
    @Glenn Maynard: probablemente porque en los lenguajes tipo C, las matrices tienen una longitud fija, mientras que las listas de Python no lo son. Es más como un vector STL en C ++ o ArrayList en Java. MAK 3 oct 09 a las 19:36
  • 132
    Se llama lista, porque es una lista. [A (), 1, 'Foo', u'öäöäö ', 67L, 5,6]. Una lista. Una matriz es "una disposición de elementos en direcciones igualmente espaciadas en la memoria de la computadora" (wikipedia). Lennart Regebro 3 oct 09 a las 19:40
  • 38
    Nada en el término "matriz", entendido universalmente, sugiere una longitud fija ni nada sobre el contenido; esas son solo limitaciones de la implementación particular de matrices de C. Las listas de Python están igualmente espaciadas (punteros a objetos, internamente), o de lo contrario __getitem__no serían O (1). Glenn Maynard 3 oct 09 a las 20:13
  • 26
    @Glenn, de en.wikipedia.org/wiki/Array_data_structure: "los elementos de una estructura de datos de matriz deben tener el mismo tamaño" (cierto para los arreglos de Python, no cierto para las listas de Python) y "un conjunto de tuplas de índice válidas y las direcciones de los elementos (y por lo tanto la fórmula de direccionamiento de elementos) generalmente se fijan mientras la matriz está en uso "(no es cierto en Python para lista o matriz). Alex Martelli 3 oct 09 a las 22:27
384
variable = []

Ahora se variablerefiere a una lista vacía * .

Por supuesto, esto es una tarea, no una declaración. No hay forma de decir en Python "esta variable nunca debe referirse a otra cosa que no sea una lista", ya que Python se escribe dinámicamente.


* El tipo de Python integrado por defecto se llama lista , no matriz. Es un contenedor ordenado de longitud arbitraria que puede contener una colección heterogénea de objetos (sus tipos no importan y se pueden mezclar libremente). Esto no debe confundirse con el arraymódulo , que ofrece un tipo más cercano al arraytipo C ; los contenidos deben ser homogéneos (todos del mismo tipo), pero la longitud sigue siendo dinámica.

15
  • 12
    ¿Sería posible inicializar el contenido de la matriz, como en JavaScript? (p. ej., variable = ["Hi", "Hello"];¿ como ?)Anderson Green 18 de marzo de 2013 a las 4:31
  • 3
    Entonces, ¿cómo declararía una matriz multidimensional (por ejemplo, una matriz 2D?)Anderson Green 5 de abril de 2013 a las 1:45
  • 7
    @AndersonGreen Como dije, no existe una declaración de variable en Python. Para ello se crea una lista multidimensional mediante la adopción de una lista vacía y poner otras listas dentro de él o, si se conocen las dimensiones de la lista en el tiempo de escritura, usted podría escribir como un literal de esta manera: my_2x2_list = [[a, b], [c, d]]. Dependiendo de para qué necesite matrices multidimensionales, también podría considerar usar numpy, que define tipos de matrices para matrices multidimensionales, homogéneas y sin caja que pueden ser mucho más eficientes donde corresponda, por lo que son preferibles para cálculos numéricos. sepp2k 5 abr 13 a las 9:43
  • 1
    @IfanIqbal Sí, si contiene al menos un elemento, puedes. sepp2k 9/10/2013 a las 23:34
  • 1
    Se conoce formalmente como listaArulx Z 10/11/15 a las 4:07
165

Este es un tema sorprendentemente complejo en Python.

Respuesta practica

Las matrices están representadas por clase list(consulte la referencia y no las mezcle con generadores ).

Consulte los ejemplos de uso:

# empty array
arr = [] 

# init with values (can contain mixed types)
arr = [1, "eels"]

# get item by index (can be negative to access end of array)
arr = [1, 2, 3, 4, 5, 6]
arr[0]  # 1
arr[-1] # 6

# get length
length = len(arr)

# supports append and insert
arr.append(8)
arr.insert(6, 7)

Respuesta teórica

Debajo del capó, Python listes un contenedor para una matriz real que contiene referencias a elementos. Además, la matriz subyacente se crea con algo de espacio adicional.

Las consecuencias de esto son:

  • el acceso aleatorio es realmente barato ( arr[6653]es lo mismo que arr[0])
  • append la operación es 'gratis' mientras que algo de espacio extra
  • insert la operación es cara

Consulte esta impresionante tabla de complejidad de operaciones .

Además, vea esta imagen, donde he intentado mostrar las diferencias más importantes entre la matriz, la matriz de referencias y la lista vinculada: matrices, matrices en todas partes

5
  • 6
    Solo para agregar, hay una forma realmente genial de cortar matrices en Python: el [1, 2, 3, 4, 5, 6, 7, 8, 9][1:-2]resultado será[2, 3, 4, 5, 6, 7]Anton 16 de marzo de 2016 a las 17:19
  • 3
    Veo algunos votos negativos para esta publicación de vez en cuando. Sería genial si alguien pudiera publicar una palabra por qué. Gracias. Anton 31/10/2016 a las 12:29
  • 2
    Eres un verdadero MVP. Es necesario conocer el diseño real elegido de la "lista" para poder tomar decisiones de programación razonables. Básicamente es como un 'vector' en C ++. ¡Gracias! Necro 6 de noviembre de 2017 a las 0:15
  • ¡Esta es una respuesta realmente larga con una gran explicación! Ahmed 3 de agosto de 2019 a las 2:18
  • ¿Puedo agregar la notación práctica para comparar, por ejemplo: a == b[:2]devuelve Verdadero si los primeros 2 elementos de b son iguales a los valores de la matriz aBruno L. 17 de mayo de 2020 a las 10:53
132

En realidad, no declaras cosas, pero así es como creas una matriz en Python:

from array import array
intarray = array('i')

Para obtener más información, consulte el módulo de matriz: http://docs.python.org/library/array.html

Ahora es posible que no desee una matriz, sino una lista, pero otros ya lo han respondido. :)

6
  • 10
    Esto es algo divertido, pero no es una buena respuesta para una pregunta etiquetada como "principiante". Solo para dejarlo en claro: en Python, generalmente usa un tipo de datos llamado a list. Python tiene un tipo de datos de propósito especial llamado an, arrayque se parece más a una matriz C y se usa poco. steveha 4 de octubre de 2009 a las 2:48
  • sesenta y cinco
    No, pero todos los demás ya usaron una lista. Pensé que sería una buena respuesta señalar que también hay matrices. Lennart Regebro 4 de octubre de 2009 a las 7:38
  • 9
    apoyos súper locos para esta respuesta. He estado programando en Python durante años y solo recientemente me di cuenta de que había un objeto de matriz de Python real que es diferente de los objetos de lista. Si bien la estructura de datos es muy similar, las matrices limitan el tipo de objetos que la matriz puede contener. ¡Gran respuesta @LennartRegebro! Josh Brown 4 de julio de 2015 a las 10:38
  • 4
    Esta debería ser la respuesta correcta La lista y las matrices son dos cosas diferentes @LennartRegebro graciasMina Gabriel 28/10/2016 a las 10:48
  • Existe una razón específica por la que es posible que desee utilizar matrices en lugar de listas. Específicamente, si tiene una matriz llamada myarray llena de números, puede realizar operaciones matemáticas contra ella, y esas operaciones se aplican a todos los elementos dentro de ella. Por lo tanto, si ejecuta myarray / 3, cada número dentro se divide por 3. Si intenta hacer lo mismo con una lista, obtendrá un error. Por lo tanto, las matrices son más eficientes para grandes conjuntos de datos de números. Matthew 14/07/19 a las 2:30
67

Creo que (quiso decir) quiere una lista con las primeras 30 celdas ya llenas. Entonces

   f = []

   for i in range(30):
       f.append(0)

Un ejemplo de dónde podría usarse esto es en la secuencia de Fibonacci. Vea el problema 2 en el Proyecto Euler

3
  • 97
    Esa es una forma bastante barroca de inicializar una lista. Intente en su f = [0] * 30lugar. John Machin 18 de diciembre de 2010 a las 6:24
  • ¿No es lo mismo que un = rango (10) de @slehar anwer? Me encanta Python, es sintaxis y es Zen. m3nda 12/06/15 a las 16:16
  • @ erm3nda nope: $ python3 Python 3.4.2 [...] >>> a = rango (10) >>> print (a) rango (0, 10) >>>arp 6 de mayo de 2017 a las 4:44
38

Así es como:

my_array = [1, 'rebecca', 'allard', 15]
2
  • 4
    Dado que esta no es una matriz de Python sino una lista de Python, ¿no sería menos confuso llamarla "my_list"? Mattis Asp 31/10/2017 a las 15:23
  • 4
    Eso crea una lista, no una matriz. Son diferentes y tienen diferentes propiedades en Python. Específicamente, puede realizar operaciones numéricas contra una matriz, pero no contra una lista. Matthew 14/07/19 a las 2:32
25

Para los cálculos, use matrices numpy como esta:

import numpy as np

a = np.ones((3,2))        # a 2D array with 3 rows, 2 columns, filled with ones
b = np.array([1,2,3])     # a 1D array initialised using a list [1,2,3]
c = np.linspace(2,3,100)  # an array with 100 points beteen (and including) 2 and 3

print(a*1.5)  # all elements of a times 1.5
print(a.T+b)  # b added to the transpose of a

Estas matrices numerosas se pueden guardar y cargar desde el disco (incluso comprimidas) y los cálculos complejos con grandes cantidades de elementos son rápidos como en C.

Muy utilizado en entornos científicos. Consulte aquí para obtener más información.

22

El comentario de JohnMachin debería ser la verdadera respuesta. ¡Todas las otras respuestas son solo soluciones en mi opinión! Entonces:

array=[0]*element_count
1
  • 2
    de acuerdo. excepto con cuidado de llamar incluso a la variable "matriz", o conseguir una ira purista. a esto también agregaría que puede crear de manera similar "matrices multidimensionales":x=[[0] * 10] * 10Peter S Magnusson 30 de mayo de 2020 a las 2:29
21

Un par de contribuciones sugirieron que las matrices en Python están representadas por listas. Esto es incorrecto. Python tiene una implementación independiente de array()en el módulo de biblioteca estándar array " array.array()" por lo que es incorrecto confundir los dos. Las listas son listas en Python, así que tenga cuidado con la nomenclatura utilizada.

list_01 = [4, 6.2, 7-2j, 'flo', 'cro']

list_01
Out[85]: [4, 6.2, (7-2j), 'flo', 'cro']

Hay una diferencia muy importante entre list y array.array(). Si bien ambos objetos son secuencias ordenadas, array.array () es una secuencia homogénea ordenada mientras que una lista es una secuencia no homogénea.

0
15

No declaras nada en Python. Solo úsala. Te recomiendo que comiences con algo como http://diveintopython.net .

5
  • 2
    Algunas veces debes declarar el tipo de una variable: si no la usas antes, una estructura de control, no existe fuera de la estructura de control y entonces estarás construyendo una nueva variable. La suposición es entonces que la variable es un int, que choca si la usa como un tipo más complejo. Clearer 19/02/15 a las 11:31
  • @Clearer sí, el uso de funciones a veces necesita declararlo y, a veces, para reproducir algunos globales cuando se usan funciones y no quiero escribir demasiados argumentos en funciones. m3nda 12/06/15 a las 16:13
  • No es solo función; una simple declaración if podría darte el mismo problema. Clearer 29/07/2015 a las 12:04
  • 1
    La programación se trata de declarar, sin importar qué idioma uses. La declaración de tipo es una historia completamente diferenteOutside_Box 15/08/18 a las 16:08
  • Si bien este enlace puede responder a la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace como referencia. Las respuestas de solo enlace pueden dejar de ser válidas si cambia la página enlazada. Adrian Tompkins 4 dic 2019 a las 21:02
13

Normalmente haría lo a = [1,2,3]que en realidad es un listpero para arraysver esta definición formal

12

Para agregar a la respuesta de Lennart, se puede crear una matriz como esta:

from array import array
float_array = array("f",values)

donde los valores pueden tomar la forma de una tupla, lista o np.array, pero no una matriz:

values = [1,2,3]
values = (1,2,3)
values = np.array([1,2,3],'f')
# 'i' will work here too, but if array is 'i' then values have to be int
wrong_values = array('f',[1,2,3])
# TypeError: 'array.array' object is not callable

y la salida seguirá siendo la misma:

print(float_array)
print(float_array[1])
print(isinstance(float_array[1],float))

# array('f', [1.0, 2.0, 3.0])
# 2.0
# True

La mayoría de los métodos para la lista también funcionan con arreglo, los más comunes son pop (), extend () y append ().

A juzgar por las respuestas y los comentarios, parece que la estructura de datos de la matriz no es tan popular. Sin embargo, me gusta, de la misma manera que uno podría preferir una tupla a una lista.

La estructura de la matriz tiene reglas más estrictas que una lista o np.array, y esto puede reducir los errores y facilitar la depuración, especialmente cuando se trabaja con datos numéricos.

Los intentos de insertar / agregar un flotante a una matriz int arrojarán un TypeError:

values = [1,2,3]
int_array = array("i",values)
int_array.append(float(1))
# or int_array.extend([float(1)])

# TypeError: integer argument expected, got float

Mantener los valores que están destinados a ser enteros (por ejemplo, una lista de índices) en la forma de matriz puede evitar un "TypeError: los índices de lista deben ser enteros, no flotantes", ya que las matrices se pueden iterar, similar a np.array y listas:

int_array = array('i',[1,2,3])
data = [11,22,33,44,55]
sample = []
for i in int_array:
    sample.append(data[i])

De manera molesta, agregar un int a una matriz flotante hará que el int se convierta en un flotante, sin lanzar una excepción.

np.array también retiene el mismo tipo de datos para sus entradas, pero en lugar de dar un error, cambiará su tipo de datos para que se ajuste a las nuevas entradas (generalmente a double o str):

import numpy as np
numpy_int_array = np.array([1,2,3],'i')
for i in numpy_int_array:
    print(type(i))
    # <class 'numpy.int32'>
numpy_int_array_2 = np.append(numpy_int_array,int(1))
# still <class 'numpy.int32'>
numpy_float_array = np.append(numpy_int_array,float(1))
# <class 'numpy.float64'> for all values
numpy_str_array = np.append(numpy_int_array,"1")
# <class 'numpy.str_'> for all values
data = [11,22,33,44,55]
sample = []
for i in numpy_int_array_2:
    sample.append(data[i])
    # no problem here, but TypeError for the other two

Esto también es cierto durante la asignación. Si se especifica el tipo de datos, np.array, siempre que sea posible, transformará las entradas a ese tipo de datos:

int_numpy_array = np.array([1,2,float(3)],'i')
# 3 becomes an int
int_numpy_array_2 = np.array([1,2,3.9],'i')
# 3.9 gets truncated to 3 (same as int(3.9))
invalid_array = np.array([1,2,"string"],'i')
# ValueError: invalid literal for int() with base 10: 'string'
# Same error as int('string')
str_numpy_array = np.array([1,2,3],'str')
print(str_numpy_array)
print([type(i) for i in str_numpy_array])
# ['1' '2' '3']
# <class 'numpy.str_'>

o, en esencia:

data = [1.2,3.4,5.6]
list_1 = np.array(data,'i').tolist()
list_2 = [int(i) for i in data]
print(list_1 == list_2)
# True

mientras que la matriz simplemente dará:

invalid_array = array([1,2,3.9],'i')
# TypeError: integer argument expected, got float

Debido a esto, no es una buena idea usar np.array para comandos de tipo específico. La estructura de la matriz es útil aquí. list conserva el tipo de datos de los valores.

Y por algo que encuentro bastante molesto: el tipo de datos se especifica como el primer argumento en array (), pero (normalmente) el segundo en np.array (). : |

Aquí se hace referencia a la relación con C: Python List vs. Array: ¿cuándo usarlo?

¡Diviértete explorando!

Nota: La naturaleza escrita y bastante estricta de la matriz se inclina más hacia C que hacia Python, y por diseño, Python no tiene muchas restricciones específicas de tipo en sus funciones. Su impopularidad también crea una retroalimentación positiva en el trabajo colaborativo, y reemplazarlo implica principalmente un [int (x) para x en el archivo] adicional. Por lo tanto, es completamente viable y razonable ignorar la existencia de array. No debería obstaculizar a la mayoría de nosotros de ninguna manera. :D

8

Qué tal esto...

>>> a = range(12)
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
>>> a[7]
6
6

Siguiendo a Lennart, también hay numpy que implementa matrices multidimensionales homogéneas.

6

Python los llama listas . Puede escribir una lista literal con corchetes y comas:

>>> [6,28,496,8128]
[6, 28, 496, 8128]
4

Tenía una matriz de cadenas y necesitaba una matriz de la misma longitud de valores booleanos iniciados en True. Esto es lo que hice

strs = ["Hi","Bye"] 
bools = [ True for s in strs ]
1
  • Estoy aquí porque quería la declaración C: int count[26]={0}; probablemente haya una forma mejor, pero esta variante de boolsarriba funcionó. count=[0 for ii in range(26)]Más tarde, la cambié por la count=[0]*26que parece preferible. user1683793 21/12/18 a las 23:14
3

Puede crear listas y convertirlas en matrices o puede crear matrices usando el módulo numpy. A continuación se muestran algunos ejemplos para ilustrar lo mismo. Numpy también facilita el trabajo con matrices multidimensionales.

import numpy as np
a = np.array([1, 2, 3, 4])

#For custom inputs
a = np.array([int(x) for x in input().split()])

También puede remodelar esta matriz en una matriz de 2X2 usando la función de remodelación que toma la entrada como las dimensiones de la matriz.

mat = a.reshape(2, 2)