2011-08-05 153 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