如何创建动态数组

25 投票
1 回答
41350 浏览
提问于 2025-04-16 22:56

我理解,Python里的list类型是一种动态指针数组,当你往里面添加东西时,它的容量会自动增加。而NumPy中的数组则是使用连续的内存区域来存放所有的数据。

有没有那种类型,既能像列表一样动态增加容量,又能像NumPy数组那样存储值?就像C#里的List那样。如果这个类型的接口和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数组那样使用,我觉得在np.resize()之前通过get_data()返回的所有视图都会保持旧数组的状态。

编辑:array模块中的array类型是动态数组。下面的程序测试了列表和数组的增长因子:

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()

在这里输入图片描述

从图中可以看出,列表的增长因子比数组要大。

1 个回答

23

你可能会想知道,Python的标准库里还有一个叫做array的模块,听起来正是你需要的:

这个模块定义了一种对象类型,可以紧凑地表示基本值的数组:字符、整数和浮点数。数组是一种序列类型,和列表的行为非常相似,只不过存储在里面的对象类型是有限制的。

撰写回答