2012-04-12 45 views
22

Quiero ser capaz de 'construir' una matriz numpy sobre la marcha, no sé el tamaño de esta matriz por adelantado.Inicializar matriz numpy de longitud desconocida

Por ejemplo, yo quiero hacer algo como esto:

a= np.array() 
for x in y: 
    a.append(x) 

lo que resultaría en un contengan todos los elementos de x, obviamente esto es una respuesta trivial. Solo tengo curiosidad si esto es posible?

+2

Lo que puede ser un enfoque más eficiente es asignar una gran variedad y duplicar su tamaño cada vez que se alcanza la capacidad. – wim

Respuesta

48

Construir una lista de Python y convertir eso a una matriz Numpy. Eso toma O (1) tiempo amortizado por apéndice + O (n) para la conversión a matriz, para un total de O (n).

a = [] 
    for x in y: 
     a.append(x) 
    a = np.array(a) 
+0

O mejor aún: 'a = np.array ([x para x en y])'; o simplemente 'a = np.array (list (y))' –

8

Usted puede hacer esto:

a = np.array([]) 
for x in y: 
    a = np.append(a, x) 
+5

Eso requiere tiempo lineal por apéndice. –

+6

Este enfoque copia la matriz cada anexión, que es O (suma (rango (n))). En mi computadora portátil, este método era 42 veces más lento que el método de @ larsman: crear una lista siguiendo el método de larsmans me lleva exactamente a 1000 loops, lo mejor de 3: 1.53 ms por ciclo. Seguir este método me lleva exactamente 10 bucles, el mejor de 3: 64.8 ms por bucle. –

1

Para la posteridad, creo que esto es más rápido:

a = np.array([np.array(list()) for _ in y]) 

Usted podría incluso ser capaz de pasar de un generador (es decir, [] ->()), en cuyo caso la lista interna es nunca completamente almacenado en la memoria.


respuesta a comentar a continuación:

>>> import numpy as np 
>>> y = range(10) 
>>> a = np.array([np.array(list) for _ in y]) 
>>> a 
array([array(<type 'list'>, dtype=object), 
     array(<type 'list'>, dtype=object), 
     array(<type 'list'>, dtype=object), 
     array(<type 'list'>, dtype=object), 
     array(<type 'list'>, dtype=object), 
     array(<type 'list'>, dtype=object), 
     array(<type 'list'>, dtype=object), 
     array(<type 'list'>, dtype=object), 
     array(<type 'list'>, dtype=object), 
     array(<type 'list'>, dtype=object)], dtype=object) 
+0

Hice un cambio aquí: list (_) y funcionó muy bien – javadba

+0

Para ser claro @javadba, no necesita hacer eso - Soy Seguro que hay algunos Pythonistas que se ofenden :) – BenDundee

+0

Esto no es una cuestión de estilo. sin la lista (_) ni siquiera funciona para el caso que tengo que y es una matriz en sí misma – javadba

0
a = np.empty(0) 
for x in y: 
    a = np.append(a, x) 
4

Puesto que y es un iterable Realmente no veo por qué las llamadas que se añadirán:

a = np.array(list(y)) 

va a hacer y es mucho más rápido:

import timeit 

print timeit.timeit('list(s)', 's=set(x for x in xrange(1000))') 
# 23.952975494633154 

print timeit.timeit("""li=[] 
for x in s: li.append(x)""", 's=set(x for x in xrange(1000))') 
# 189.3826994248866 
Cuestiones relacionadas