私が理解しているように、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()によって返されたビューは古い配列を保持します。
編集:アレイモジュールの配列タイプは動的配列です。グラフから
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