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()
a partir del gráfico: el factor de aumento de la lista es más grande que array.
¿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
@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