2011-08-05 15 views
13

Jak rozumiem, typ list w Pythonie jest dynamiczną tablicą wskaźników, która zwiększy jej pojemność, gdy elementy zostaną do niej dołączone. A tablica w NumPy wykorzystuje ciągły obszar pamięci do przechowywania wszystkich danych tablicy.Jak utworzyć tablicę dynamiczną

Czy są jakieś typy, które dynamicznie zwiększają swoją pojemność jako listę i przechowuje wartość jako tablicę NumPy? Coś jak Lista w C#. I świetnie, jeśli typ ma ten sam interfejs co tablica NumPy.

mogę utworzyć klasę, która otacza tablicę NumPy wewnątrz, a rozmiar tej tablicy, kiedy jest pełny, takich jak:

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 

ale DynamicArray nie może być stosowany jako tablicy numpy i myślę, że wszystko widoki zwrócone przez get_data() zanim np.resize() zatrzyma starą tablicę.

Edytuj: typ tablicy w module tablicy to dynamiczna tablica. Następujący program testowania współczynnika zwiększania listy i tablicy:

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

z wykresu: czynnik wzrostu listy jest większa niż tablicy.

+1

Wiesz, że numpy ma funkcję dopełniającą, prawda? Tworzy kopię danych, ale tak samo jak "numpy.resize", której używasz powyżej. Jeśli to nie robi, co chcesz, to czy możesz wyjaśnić nieco więcej, dlaczego tego chcesz? – senderle

+0

@senderle: Tak, znam funkcję dołączania, ale potrzebuję tablicy dynamicznej, która zwiększy jej pojemność o współczynnik taki jak 1,25, gdy jest pełny. – HYRY

Odpowiedz

13

Możesz być zainteresowany, aby wiedzieć, że biblioteka standardowa Pythona zawiera również moduł array który brzmi jak tylko to, co chcesz:

Moduł ten określa typ obiektu, który może zwięźle stanowią szereg podstawowych wartości : znaki, liczby całkowite, liczby zmiennoprzecinkowe. Tablice są typami sekwencji i zachowują się bardzo podobnie do list, z wyjątkiem tego, że typ przechowywanych w nich obiektów jest ograniczony.

+0

dziękuję. Nie wiedziałem, że tablica ma metodę append(). Będzie świetnie, jeśli w NumPy jest podobny typ, ponieważ chcę używać ufuncs do wykonywania obliczeń z tą tablicą dynamiczną. – HYRY

+0

@ user772649, o ile jest to warte, metoda 'append'' tablic' nie zwiększa jej współczynnika - zwiększa jej pojemność dokładnie o jeden. Podobnie metoda 'extend' zwiększa jej pojemność dokładnie o liczbę dodanych elementów. – senderle

+0

@senderle, przetestowałem metodę append z tablicy, mierząc czas, który kosztował, ponieważ zmiana rozmiaru tablicy będzie miała więcej czasu. Zmieniłem oryginalne pytanie i dodałem wykres wzrostu. Na wykresie widać, że tablica zwiększa się o czynnik, który jest mały niż lista. – HYRY

Powiązane problemy