2011-08-05 43 views
13

Según tengo entendido, el tipo list en Python es una matriz de punteros dinámica, que aumentará su capacidad cuando se añadan elementos. Y una matriz en NumPy usa un área de memoria continua para contener todos los datos de la matriz.Cómo crear una matriz dinámica

¿Hay algún tipo que aumente dinámicamente su capacidad como una lista y almacene el valor como una matriz NumPy? Algo así como List in C#. Y es genial si el tipo tiene la misma interfaz que una matriz NumPy.

puedo crear una clase que envuelve una matriz NumPy interior, y cambiar el tamaño de esta matriz cuando está lleno, tales como:

class DynamicArray(object): 
    def __init__(self): 
     self._data = np.zeros(100) 
     self._size = 0 

    def get_data(self): 
     return self._data[:self._size] 

    def append(self, value): 
     if len(self._data) == self._size: 
      self._data = np.resize(self._data, int(len(self._data)*1.25)) 
     self._data[self._size] = value 
     self._size += 1 

pero DynamicArray no se puede utilizar como una matriz NumPy, y creo que todos las vistas devueltas por get_data() antes de np.resize() contendrán la matriz anterior.

Editar: el tipo de matriz en el módulo de matriz es una matriz dinámica. El programa siguiente prueba el factor de aumento de la lista y matriz:

from array import array 
import time 
import numpy as np 
import pylab as pl 

def test_time(func): 
    arrs = [func() for i in xrange(2000)] 
    t = [] 
    for i in xrange(2000): 
     start = time.clock() 
     for a in arrs: 
      a.append(i) 
     t.append(time.clock()-start) 
    return np.array(t) 

t_list = test_time(lambda:[]) 
t_array = test_time(lambda:array("d")) 
pl.subplot(211) 
pl.plot(t_list, label="list") 
pl.plot(t_array, label="array") 
pl.legend() 
pl.subplot(212) 
pl.plot(np.where(t_list>2*np.median(t_list))[0]) 
pl.plot(np.where(t_array>2*np.median(t_array))[0]) 
pl.show() 

enter image description here

a partir del gráfico: el factor de aumento de la lista es más grande que array.

+1

¿Sabía que numpy tiene una función de adición, ¿verdad? Crea una copia de los datos, pero también lo hace 'numpy.resize' que usa arriba. Si eso no hace lo que quieres, ¿podrías explicar un poco más por qué quieres esto? – senderle

+0

@senderle: Sí, conozco la función de agregar, pero necesito una matriz dinámica que aumente su capacidad por un factor de 1.25 cuando esté llena. – HYRY

Respuesta

13

Usted puede estar interesado en saber que la biblioteca estándar de Python también incluye un módulo array que suena como justo lo que desea:

Este módulo define un tipo de objeto que puede representar de forma compacta una serie de los valores básicos : caracteres, enteros, números de coma flotante. Las matrices son tipos de secuencia y se comportan de manera muy similar a las listas, excepto que el tipo de objetos almacenados en ellas está restringido.

+0

gracias. No sabía que la matriz tenía el método append(). Será genial si hay algún tipo similar en NumPy, porque quiero usar ufuncs para hacer cálculos con esta matriz dinámica. – HYRY

+0

@ user772649, por lo que vale, el método 'append' de una' matriz' no aumenta su capacidad por un factor: aumenta su capacidad en exactamente una. Del mismo modo, el método 'extender' aumenta su capacidad en exactamente el número de elementos agregados. – senderle

+0

@senderle, probé el método append de array midiendo el tiempo que costaba, ya que cambiar el tamaño de la matriz usará más tiempo. Edité la pregunta original y agregué el gráfico de aumento. En el gráfico, puede ver que la matriz aumenta por factor, que es pequeña que la lista. – HYRY

Cuestiones relacionadas