2010-10-30 38 views
116

Estoy intentando construir un histograma de recuentos ... así que creo cubos. Sé que sólo podía pasar por y añadir un montón de ceros es decir algo como lo siguiente:Cómo declarar una matriz de ceros en Python (o una matriz de cierto tamaño)

buckets = [] 
for i in xrange(0,100): 
    buckets.append(0) 

¿Hay una manera más elegante de hacerlo? Siento que debería haber una forma de declarar una matriz de cierto tamaño.

sé numpy tiene numpy.zeros pero quiero la solución más general

+2

Las listas de Python son listas, no matrices. Y en Python no declaras cosas como las que haces en C: defines funciones y clases (a través de sentencias def y class) y asignas variables que, si no existen ya, se crean mágicamente en la primera asignación. Además, las variables (y listas) no son regiones de memoria que contienen objetos, sino nombres que se refieren a ellos. Un objeto puede estar contenido en una sola región de memoria pero puede ser referenciado por varios nombres. – pillmuncher

+1

Python no tiene "declaraciones", especialmente de contenedores con un tamaño pero con contenido no especificado. Quieres algo, escribes una expresión. –

+3

... y los puntos y comas son completamente innecesarios – bstpierre

Respuesta

250
buckets = [0] * 100 
+18

cuidadosa - [esta técnica no generalizar a matrices multidimensionales o listas de listas] (https://docs.python.org/2/faq/programming.html#how-do -i-create-a-multidimensional-list). – rphv

15

Puede multiplicar un list por un entero n repetir los listn veces:

buckets = [0] * 100 
3

La solución más simple sería ser

"\x00" * size # for a buffer of binary zeros 
[0] * size # for a list of integer zeros 

En general, debe usar más código pitónico como la comprensión de la lista (en su ejemplo: [0 for unused in xrange(100)]) o usar string.join para búferes.

+3

Estoy de acuerdo en que la comprensión de la lista parece más Pythonic. Sin embargo, lo sincronicé y descubrí que es aproximadamente 10 veces más lento que la sintaxis de multiplicación. Lo sé, algo que preoptimiza el mal. – Lenna

+0

Estoy creando una 'matriz ('I')' y estaba usando '(0 para i en rango (conteo))' 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 ralentizarse, sale con 'pythonic' y con * fast *. – IAbstract

11

uso numpy

import numpy 
zarray = numpy.zeros(100) 

y luego usar la función de biblioteca Histogram

+2

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

0

Dependiendo de lo que realmente va a hacer con los datos después de que se recogió, collections.defaultdict (int) podría ser útil .

16

Utilice esta:

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 se salida adecuada vacío multidimensional lista del cubo 100x100

+0

¿Qué pasa con 'cubo = [[0] * w] * h'? – RobinHood

77

simplemente para la corrección: Declarar una lista multidimensional de ceros en pitón tienes que usar una lista de comprensión como esta:

buckets = [[0 for col in range(5)] for row in range(10)] 

para evitar compartir las 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 tarde. Vea el Python FAQ para más detalles.

+0

Sí, tienes razón, a menos que por alguna extraña razón quieras operar con n copias de la misma matriz :) – meeDamian

-1

Bueno me gustaría ayudarle mediante la publicación de un programa de ejemplo y su salida

Programa: -

t=input("") 

x=[None]*t 

y=[[None]*t]*t 

for i in range(1,t+1): 

     x[i-1]=i; 
     for j in range(1,t+1): 
      y[i-1][j-1]=j; 

print x 

print y 

de salida: -

2 

[1, 2] 

[[1, 2], [1, 2]] 

Espero que esto aclare algunas muy básica concepto tuyo con respecto a su declaración. Para inicializarlos con algunos otros valores específicos, como inicializarlos con 0 ...se puede declarar como:

x = [0] * 10

creo que sirve .. !! ;)

-2

Si necesita más columnas:

buckets = [[0., 0., 0., 0., 0.] for x in range(0)] 
1

La pregunta dice "¿Cómo declarar serie de ceros ...", pero luego el código de ejemplo hace referencia a la lista de Python:

buckets = [] # this is a list 

Sin embargo, si alguien está realmente querer inicializar una matriz, que sugieren:

from array import array 

my_arr = array('I', [0] * count) 
purista

El pitón podría reclamar este no es Pythonic y sugieren:

my_arr = array('I', (0 for i in range(count))) 

El Pythonic versión es muy lento y cuando usted tiene unos pocos cientos de matrices para ser inicializado con miles de valores, la diferencia es bastante notable.

Cuestiones relacionadas