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()
z wykresu: czynnik wzrostu listy jest większa niż tablicy.
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
@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