2009-12-07 25 views
20

No debería ser tan difícil. Me refiero a C,¿Cómo crear una matriz de enteros en Python?

int a[10]; 

es todo lo que necesita. Cómo crear una matriz de todos los ceros para un tamaño aleatorio. Sé que la función de ceros() funciona en NumPy, pero debe haber una manera fácil incorporada, no otro módulo.

+1

Python no tiene una estructura de datos de la matriz incorporada. Lo más cerca que te encuentras son listas. – int3

+3

Sorprendentemente, nadie ha preguntado para qué necesita esto. Por lo general, las listas están bien, independientemente del hecho de que pueda almacenar otras cosas en ellas (son solo listas de referencias a otros objetos, que pueden ser cualquier cosa). Pero tal vez haya alguna razón que no funcionaría bien para usted ... –

+2

Recomiendo encarecidamente el tutorial de Python: http://docs.python.org/tutorial/ Solo le tomará un par de horas de su tiempo. –

Respuesta

20

Si no está satisfecho con las listas (ya que pueden contener cualquier cosa y tomar demasiada memoria) se puede utilizar matriz eficiente de los números enteros:

import array 
array.array('i') 

Ver here

Si necesita inicializar que,

a = array.array('i',(0 for i in range(0,10))) 
+1

Esto inicializará una matriz con 9 elementos, no 10 –

+0

Esta parece ser la forma más eficiente. –

+0

Cambió 9 a 10 (-: –

6
>>> a = [0] * 10 
>>> a 
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
1
a = 10 * [0] 

le da una matriz de longitud 10, llena de ceros.

+3

Esto no se llama una matriz en Python, es una lista –

+0

Creo que el interrogador tomó la terminología de "matriz" de C, y busca una alternativa incorporada cercana en Python. En muchos casos, uno solo usaría una lista en Python. – catchmeifyoutry

+0

catchmeifyoutry: Debo dejar que el consultante sepa la terminología correcta para lo que están usando, no importa cuál sea la alternativa C es –

22

de dos maneras:

x = [0] * 10 
x = [0 for i in xrange(10)] 

Editar: range reemplazados por xrange para evitar crear otra lista.

También: como muchos otros han notado incluyendo Pi y Ben James, esto crea un list, no una matriz de Python. Si bien una lista es, en muchos casos, suficiente y fácil, para usos críticos para el rendimiento (por ejemplo, cuando se duplica en miles de objetos), podría examinar las matrices de python. Busque el módulo array, como se explica en las otras respuestas de este hilo.

+2

Esta es una lista. Puede contener objetos de cualquier tipo, no solo enteros. Y usa mucha más memoria RAM de la necesaria para enteros. –

+1

No solo eso, range devuelve una lista también. Entonces la segunda línea al menos usará el doble de la memoria de la lista resultante. –

+2

Tenga cuidado al multiplicar listas: le dará problemas con los objetos mutables. La multiplicación no clona elementos, sino que simplemente le da el mismo objeto que aparece varias veces en una lista. Pruebe esto: 'a = [[1]] * 3; a [1] .append (2) '. Por lo tanto, anexar 'a [1]' realmente cambiará todos los elementos de ay le dará '[[1,2], [1,2], [1,2]]'. – badp

6

utilizar el módulo matriz. Con él puede almacenar colecciones del mismo tipo de manera eficiente.

>>> import array 
>>> import itertools 
>>> a = array_of_signed_ints = array.array("i", itertools.repeat(0, 10)) 

Para obtener más información, por ejemplo, diferentes tipos, mira the documentation of the array module. Para hasta 1 millón de entradas esto debería sentirse muy rápido. Para 10 millones de entradas, mi máquina local piensa durante 1,5 segundos.

El segundo parámetro a array.array es un generador , que construye la secuencia definida como que se lee. De esta forma, el módulo de matriz puede consumir los ceros uno por uno, pero el generador solo usa memoria constante. Este generador no se agranda (en cuanto a la memoria) si la secuencia se alarga. La matriz crecerá, por supuesto, pero eso debería ser obvio.

Se utiliza como una lista:

>>> a.append(1) 
>>> a.extend([1, 2, 3]) 
>>> a[-4:] 
array('i', [1, 1, 2, 3]) 
>>> len(a) 
14 

... o simplemente convertir a una lista:

>>> l = list(a) 
>>> len(l) 
14 

Sorprendentemente

>>> a = [0] * 10000000 

es más rápido en la construcción de el método de matriz. ¡Imagínate!:)

1
import random 

def random_zeroes(max_size): 
    "Create a list of zeros for a random size (up to max_size)." 
    a = [] 
    for i in xrange(random.randrange(max_size)): 
    a += [0] 

Uso range su lugar si está utilizando Python 3.x

1

Si necesita inicializar una matriz rápidamente, puede hacerlo por bloques en lugar de con un inicializador de generador, y va a ser mucho más rápido. Crear una lista por [0]*count es igual de rápido, aún.

import array 

def zerofill(arr, count): 
    count *= arr.itemsize 
    blocksize = 1024 
    blocks, rest = divmod(count, blocksize) 
    for _ in xrange(blocks): 
     arr.fromstring("\x00"*blocksize) 
    arr.fromstring("\x00"*rest) 

def test_zerofill(count): 
    iarr = array.array('i') 
    zerofill(iarr, count) 
    assert len(iarr) == count 

def test_generator(count): 
    iarr = array.array('i', (0 for _ in xrange(count))) 
    assert len(iarr) == count 

def test_list(count): 
    L = [0]*count 
    assert len(L) == count 

if __name__ == '__main__': 
    import timeit 
    c = 100000 
    n = 10 
    print timeit.Timer("test(c)", "from __main__ import c, test_zerofill as test").repeat(number=n) 
    print timeit.Timer("test(c)", "from __main__ import c, test_generator as test").repeat(number=n) 
    print timeit.Timer("test(c)", "from __main__ import c, test_list as test").repeat(number=n) 

Resultados:

(array in blocks) [0.022809982299804688, 0.014942169189453125, 0.014089107513427734] 
(array with generator) [1.1884641647338867, 1.1728270053863525, 1.1622772216796875] 
(list) [0.023866891860961914, 0.035660028457641602, 0.023386955261230469] 
+0

interesante, python realmente optimiza la inicialización. 9.04, python 2.6.2 (trunqué la salida un poco): (matriz en bloques) [0.0191, 0.0180, 0.0170] (matriz con generador) [0.9199, 0.9179, 0.6761] (lista) [0.0069, 0.0074 , 0.0064] así mis listas de máquinas son significativamente más rápidas. izer.se, ¿qué OS/python estás ejecutando? – catchmeifyoutry

+0

Esto era de mi venerable iBook, una computadora portátil de 5 años de edad con PowerPC G4 con Debian/Linux, por supuesto. Sin duda hay máquinas más rápidas :-) – u0b34a0f6ae

+0

Mi punto no es comparar nuestras máquinas, sino comparar las diferencias de tiempo en las máquinas.Sus resultados muestran más o menos (matriz en bloques) en el mismo orden de velocidad que (lista), mientras que en mi máquina (o implementación de python) el método (lista) es un factor más rápido. – catchmeifyoutry

Cuestiones relacionadas