Si je comprends bien, le type list
en Python est un tableau de pointeur dynamique, ce qui augmentera sa capacité lorsque des éléments sont ajoutés à elle. Et un tableau dans NumPy utilise une zone de mémoire continue pour contenir toutes les données du tableau.Comment créer un tableau dynamique
Existe-t-il des types qui augmentent de manière dynamique sa capacité en tant que liste, et stocke la valeur en tant que tableau NumPy? Quelque chose comme List in C#. Et c'est génial si le type a la même interface qu'un tableau NumPy.
Je peux créer une classe qui encapsule un tableau numpy à l'intérieur, et redimensionner ce tableau quand il est plein, comme:
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
mais DynamicArray ne peut pas être utilisé comme tableau numpy, et je pense que tous les les vues renvoyées par get_data() avant que np.resize() ne contienne l'ancien tableau.
Edit: type de réseau dans le module de tableau est un tableau dynamique. Le programme suivant tester le facteur d'augmentation de la liste et tableau:
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()
du graphique: le facteur d'augmentation de la liste est plus grand que tableau.
Vous ne savez que numpy a une fonction append, non? Il crée une copie des données, mais il en est de même pour 'numpy.resize' que vous utilisez ci-dessus. Si cela ne fait pas ce que vous voulez, pourriez-vous expliquer un peu plus pourquoi vous le voulez? – senderle
@senderle: Oui, je connais la fonction d'ajout, mais j'ai besoin d'un tableau dynamique qui augmente sa capacité d'un facteur tel que 1,25 quand il est plein. – HYRY