2011-08-05 10 views
13

私が理解しているように、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() 

enter image description here

:次のプログラムは、リスト、アレイの増加率をテストリストの増加率はアレイよりも大きいです。

+1

numpyには追加機能があります。これはデータのコピーを作成しますが、上記で使用する 'numpy.resize'も同様です。それがあなたが望むことをしなければ、あなたはなぜこれを望んでいるのかもう少し説明できますか? – senderle

+0

@senderle:はい私は追加機能を知っていますが、容量がフルになったときに1.25などの容量で容量を増やすダイナミックアレイが必要です。 – HYRY

答えて

13

あなたはPythonの標準ライブラリはまた、あなたがしたいだけで何のように聞こえるarrayモジュールが含まれていることを知って興味があるかもしれない:

このモジュールはコンパクトに基本的な価値観の 配列を表すことができ、オブジェクト型を定義します:文字、整数、浮動小数点数。 配列はシーケンス型であり、リストに非常によく似ていますが、 に格納されているオブジェクトの種類が制約されています。

+0

ありがとうございます。配列にappend()メソッドがあるかどうかはわかりませんでした。 NumPyに類似の型があるとうまくいくでしょう。なぜなら、この動的配列でufuncを使って計算をしたいからです。 – HYRY

+0

@ user772649、それは価値があるため、 '配列'の 'append'メソッドは、その容量を因子で増加させません - それは容量をちょうど1だけ増加させます。同様に、 'extend'メソッドは、追加された項目の数だけその容量を増加させます。 – senderle

+0

@senderle、私は配列のappendメソッドをテストしました。元の質問を編集し、増加グラフを追加しました。グラフから、配列がfactorよりも大きくなることがわかります。これはlistよりも小さいものです。 – HYRY

関連する問題