據我所知,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()
:下面的程序測試列表和數組的增加係數列表的增加係數比陣列更大。
你知道numpy有一個附加功能,對嗎?它創建了數據的副本,但是,上面使用的'numpy.resize'也是如此。如果這不符合你的要求,那麼你能否解釋一下爲什麼你要這麼做? – senderle
@senderle:是的,我知道追加函數,但我需要一個動態數組,當它滿了時,它的容量可以增加1.25倍。 – HYRY