Cómo declarar una matriz de ceros en Python (o una matriz de cierto tamaño) [duplicate]
⏰ 4 minutos de lectura
usuario491880
Estoy tratando de construir un histograma de conteos… así que creo cubos. Sé que podría pasar y agregar un montón de ceros, es decir, algo así:
buckets = []
for i in xrange(0,100):
buckets.append(0)
¿Hay una forma más elegante de hacerlo? Siento que debería haber una manera de declarar una matriz de cierto tamaño.
Sé que numpy tiene numpy.zeros pero quiero la solución más general
Las listas de Python son listas, no arreglos. Y en Python no declaras cosas como lo haces en C: defines funciones y clases (a través de declaraciones de definición y clase) y asignas variables que, si aún no existen, se crean mágicamente en la primera asignación. Además, las variables (y las listas) no son regiones de memoria que contienen, sino nombres que se refieren a objetos. Un objeto puede estar contenido en una sola región de memoria, pero puede ser referenciado por varios nombres.
– pastillero
30 de octubre de 2010 a las 1:10
Python no tiene “declaraciones”, especialmente de contenedores con un tamaño pero contenido no especificado. Quieres algo, escribes una expresión.
– John Maquin
30 de octubre de 2010 a las 1:14
… y los puntos y comas son completamente innecesarios
– bstpierre
30 de octubre de 2010 a las 2:03
No es un duplicado. La necesidad percibida de una lista vacía de comillas de aire inicia una conversación diferente sobre la asignación y asignación de listas. También debe haber dos páginas de destino para los diferentes términos de búsqueda, que las estadísticas indican que son comunes.
Solo para completar: para declarar una lista multidimensional de ceros en python, debe usar una lista de comprensión como esta:
buckets = [[0 for col in range(5)] for row in range(10)]
para evitar compartir referencias entre las filas.
Esto parece más torpe que el código de chester1000, pero es esencial si se supone que los valores se cambiarán más adelante. Ver el Preguntas frecuentes sobre Python para más detalles.
Sí, tienes razón, a menos que por alguna extraña razón quieras operar en n copias de la misma matriz 🙂
– meeDamián
6 de febrero de 2012 a las 8:35
mjhm
Puedes multiplicar un list por un entero n para repetir el listn veces:
buckets = [0] * 100
meedamian
Utilizar este:
bucket = [None] * 100
for i in range(100):
bucket[i] = [None] * 100
O
w, h = 100, 100
bucket = [[None] * w for i in range(h)]
Ambos generarán una lista de cubo multidimensional vacía adecuada 100×100
Lo sentimos, pero numpy.zeros se excluyó explícitamente.
– OK.
2 de febrero de 2012 a las 16:28
Resumen
La pregunta dice “Cómo declarar una matriz de ceros…” pero luego el código de muestra hace referencia a la lista de Python:
buckets = [] # this is a list
Sin embargo, si alguien realmente quiere inicializar una matriz, sugiero:
from array import array
my_arr = array('I', [0] * count)
El purista de Python podría afirmar que esto no es pitónico y sugerir:
my_arr = array('I', (0 for i in range(count)))
los pitónico La versión es muy lenta y cuando tiene unos cientos de matrices para inicializar con miles de valores, la diferencia es bastante notable.
Lo sentimos, pero numpy.zeros se excluyó explícitamente.
– OK.
2 de febrero de 2012 a las 16:28
andiperro
La solución más sencilla sería
"\x00" * size # for a buffer of binary zeros
[0] * size # for a list of integer zeros
En general, debe usar más código pythonic como lista de comprensión (en su ejemplo: [0 for unused in xrange(100)]) o utilizando string.join para tampones.
Estoy de acuerdo en que la comprensión de la lista parece más Pythonic. Sin embargo, lo cronometré y descubrí que es aproximadamente 10 veces más lento que la sintaxis de multiplicación. Lo sé, algo mal preoptimización algo.
– Lenna
22 de enero de 2013 a las 20:39
estoy creando un array('I') y estaba usando (0 for i in range(count)) para llenar … y es muy lento: 28000 elementos en la matriz. La sintaxis de multiplicación es mucho más rápida. Si ‘pythonic’ equivale a lento, entonces está fuera de ‘pythonic’ y dentro de rápido.
– Resumen
18 de febrero de 2016 a las 12:33
¿Ha sido útil esta solución?
Tu feedback nos ayuda a saber si la solución es correcta y está funcionando. De esta manera podemos revisar y corregir el contenido.
Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos.
Configurar y más información
Las listas de Python son listas, no arreglos. Y en Python no declaras cosas como lo haces en C: defines funciones y clases (a través de declaraciones de definición y clase) y asignas variables que, si aún no existen, se crean mágicamente en la primera asignación. Además, las variables (y las listas) no son regiones de memoria que contienen, sino nombres que se refieren a objetos. Un objeto puede estar contenido en una sola región de memoria, pero puede ser referenciado por varios nombres.
– pastillero
30 de octubre de 2010 a las 1:10
Python no tiene “declaraciones”, especialmente de contenedores con un tamaño pero contenido no especificado. Quieres algo, escribes una expresión.
– John Maquin
30 de octubre de 2010 a las 1:14
… y los puntos y comas son completamente innecesarios
– bstpierre
30 de octubre de 2010 a las 2:03
No es un duplicado. La necesidad percibida de una lista vacía de comillas de aire inicia una conversación diferente sobre la asignación y asignación de listas. También debe haber dos páginas de destino para los diferentes términos de búsqueda, que las estadísticas indican que son comunes.
–Bob Stein
24 de febrero a las 13:32