Cómo declarar una matriz de ceros en Python (o una matriz de cierto tamaño) [duplicate]

4 minutos de lectura

avatar de usuario
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.

    –Bob Stein

    24 de febrero a las 13:32

avatar de usuario
dan04

buckets = [0] * 100

Cuidadoso – esta técnica no se generaliza a matrices multidimensionales o listas de listas. Lo que lleva al problema inesperado de los cambios en la lista de listas reflejados en las sublistas

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

avatar de usuario
mjhm

Puedes multiplicar un list por un entero n para repetir el list n veces:

buckets = [0] * 100

avatar de usuario
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

usar numpy

import numpy
zarray = numpy.zeros(100)

Y luego usa el Histograma función de biblioteca

  • Lo sentimos, pero numpy.zeros se excluyó explícitamente.

    – OK.

    2 de febrero de 2012 a las 16:28

avatar de usuario
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

avatar de usuario
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?

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
Privacidad