Как создать динамический массив

Насколько я понимаю, тип list в Python представляет собой динамический массив указателей, который увеличивает его емкость при добавлении элементов к нему. И массив в NumPy использует область непрерывной памяти для хранения всех данных массива.

Существуют ли типы, которые динамически увеличивают его емкость как список и сохраняют значение в виде массива NumPy? Что-то вроде List in 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() 

введите описание изображения здесь

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

One Solution collect form web for “Как создать динамический массив”

Вам может быть интересно узнать, что стандартная библиотека Python также включает в себя модуль массива, который звучит так, как вы хотите:

Этот модуль определяет тип объекта, который может компактно представлять массив базовых значений: символы, целые числа, числа с плавающей запятой. Массивы представляют собой типы последовательностей и очень похожи на списки, за исключением того, что тип объектов, хранящихся в них, ограничен.

  • Изменение масштаба оси в нулевом графике
  • Элементарная мощность матрицы scipy.sparse
  • Разберите столбец Pandas в Datetime
  • Запись и чтение сложных чисел с использованием numpy.savetxt и numpy.loadtxt
  • Python - читать текстовый файл со странным форматом utf-16
  • Все еще не удается установить scipy из-за отсутствия компилятора fortran после установки brew install gcc на Mac OS X
  • pandas получают вложенные строковые значения из массивов
  • Matplotlib: Как увеличить качество цветовой палитры / ширины линии в streamplot?
  • Пункт номер быстрее, чем оператор
  • Как сделать график 3D-революции в matplotlib?
  • Упрощение строки и вывода строки, numpy
  • Python - лучший язык программирования в мире.