Как я понимаю, тип list
в Python представляет собой массив динамических указателей, который увеличивает его емкость при добавлении к нему элементов. И массив в NumPy использует непрерывную область памяти для хранения всех данных массива.
Существуют ли типы, которые динамически увеличивают свою емкость в виде списка и сохраняют значение в виде массива NumPy? Что-то вроде List в C #. И замечательно, если тип имеет тот же интерфейс, что и массив NumPy.
Я могу создать класс, который обернет массив NumPy, и изменить его размер, когда он заполнится, например:
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
но DynamicArray нельзя использовать как массив NumPy, и я думаю, что все представления, возвращаемые get_data () до того, как np.resize () будет содержать старый массив.
Редактировать: тип массива в модуле массива - это динамический массив. Следующая программа проверяет коэффициент увеличения списка и массива:
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()

из графика: коэффициент увеличения списка больше массива.