2011-08-05 156 views
13

据我所知,Python中的list类型是一个动态指针数组,它会增加项目追加到它的容量。 NumPy中的数组使用连续的内存区域来存放数组的所有数据。如何创建一个动态数组

是否有任何类型将其容量动态增加为列表,并将该值作为NumPy数组存储?像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数组,我想所有在np.resize()之前由get_data()返回的视图将保存旧数组。

编辑:数组模块中的数组类型是动态数组。从图中

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

:下面的程序测试列表和数组的增加系数列表的增加系数比阵列更大。

+1

你知道numpy有一个附加功能,对吗?它创建了数据的副本,但是,上面使用的'numpy.resize'也是如此。如果这不符合你的要求,那么你能否解释一下为什么你要这么做? – senderle

+0

@senderle:是的,我知道追加函数,但我需要一个动态数组,当它满了时,它的容量可以增加1.25倍。 – HYRY

回答

13

你可能有兴趣知道,Python标准库还包括array模块,它听起来就像你想要:

该模块定义的对象类型,可以简洁地表示 阵列基本价值:字符,整数,浮点数。 数组是序列类型,其行为与列表非常相似,但 中存储的对象类型受到限制。

+0

谢谢。我不知道该数组有append()方法。如果NumPy中有类似的类型,那将会很好,因为我想使用ufuncs来用这个动态数组进行计算。 – HYRY

+0

@ user772649,对于它的价值,'array'的append'方法不会将其容量增加一倍 - 它的容量只会增加一个。同样,'extend'方法的容量正好增加了数量。 – senderle

+0

@senderle,我测试了数组的append方法,通过测量它花费的时间,因为调整数组的大小会花费更多的时间。我编辑了原始问题并添加了增加图。从图中可以看出,数组按比例增加,这比列表小。 – HYRY