Как создать динамический массив - программирование
Подтвердить что ты не робот

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

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

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

enter image description here

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

4b9b3361

Ответ 1

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

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