2016-04-25 12 views
1

Pythonのリストはポインタでコピーを作成せず、アレイに追加します。numpyの - 私は、次の操作を行うことができますので

a = [] 
b = a 

b.append(1) 

>>> print a, b 
[1] [1] 

numpyのを使って、この動作を実現するための方法は何ですか? numpyのappendが新しい配列を作成するためです。つまり:

a = np.array([]) 
b = a 

b = np.append(b, 1) 
>>> print a, b 
[] [1.] 

EDIT 私が達成しようとしている何を:私はreで解析しようとしている大規模なテキストファイルを持っている

を:ファイル内のマーカーによっては、私は追加している配列を変更したい。たとえば:

x = np.array([]) 
y = np.array([]) 

with open("./data.txt", "r") as f: 
    for line in f: 
     if re.match('x values', line): 
      print "reading x values" 
      array = x 
     elif re.match('y', line): 
      print "reading y values" 
      array = y 
     else: 
      values = re.match("^\s+((?:[0-9.E+-]+\s*)*)", line) 
      if values: 
       np.append(array, values.groups()[0].split()) 
+2

これはできません。ナンシー配列はメモリ内に連続して配置されるため、サイズを変更したい場合は再配置する必要があります。それらに追加することは、本質的に非効率的です。あなたはあなたの問題のもう少しの文脈を与えることができますか? –

+2

[Numpyでアレイをインプレースに拡張するにはどうすればいいですか?](http://stackoverflow.com/questions/13215525/how-to-extend-an-array-in-place-in-numpy) – wnnmaw

+0

@ SvenMarnach確かに編集されました。 – Ben

答えて

1

を見てください、あなたが手際よく保つことによって、問題を解決することができるように、それが見えます数の少ない配列の辞書:

x = np.array([]) 
y = np.array([]) 
Arrays = {"x": x, "y": y} 

with open("./data.txt", "r") as f: 
    for line in f: 
     if re.match('x values', line): 
      print "reading x values" 
      key = "x" 
     elif re.match('y', line): 
      print "reading y values" 
      key = "y" 
     else: 
      values = re.match("^\s+((?:[0-9.E+-]+\s*)*)", line) 
      if values: 
       Arrays[key] = np.append(Arrays[key], values.groups()[0].split()) 

Sven Marnachはこことあなたの質問の両方のコメントで指摘しているように、これはnumpy配列の非効率的な使用です。

より良いアプローチは(再び、スヴェンが指摘するように)次のようになります。

Arrays = {"x": [], "y": []} 

with open("./data.txt", "r") as f: 
    for line in f: 
     if re.match('x values', line): 
      print "reading x values" 
      key = "x" 
     elif re.match('y', line): 
      print "reading y values" 
      key = "y" 
     else: 
      values = re.match("^\s+((?:[0-9.E+-]+\s*)*)", line) 
      if values: 
       Arrays[key].append(values.groups()[0].split()) 

Arrays = {key: np.array(Arrays[key]) for key in Arrays} 
+2

このコードは二次ランタイムを持つので、実際にはこのようにするのはお勧めできません。 –

+0

リンクされたオブジェクトに辞書を使用する特別な理由はありますか?すなわち、b = a; b.append(1) 'Pythonのリストを使うとき? – Ben

+0

@hansatz、私はより読みやすく、より明確なコードを見つける。 'a = b'の意味が理解できない人がたくさんいますので、その挙動に依存するメソッドを避けることをお勧めします。 – wnnmaw

-1

は、あなたの更新の質問に基づいてnumpy.hstack

http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.hstack.html

import numpy as np 
a = np.arange(0, 10, 1) 
b = np.array([5]) 
np.hstack((a,b)) 

戻りarray([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 5])

+0

これは、コピーを作成せずに配列に追加するとどのように役立ちますか? –

+0

あなたは 'a = np.hstack((a、b))'を実行することができます – Simon

+3

これはコピーを作成しますが、回避することはOPの質問全体です。 –

0

ので、リスト追加する以上、単純なスイッチのように書くことができます。

x, y = [], [] 
with open("./data.txt", "r") as f: 
    for line in f: 
     if re.match('x values', line): 
      print "reading x values" 
      alist = x 
     elif re.match('y', line): 
      print "reading y values" 
      alist = y 
     else: 
      values = re.match("^\s+((?:[0-9.E+-]+\s*)*)", line) 
      if values: 
       alist.append(values.groups()[0].split()) 

xy両方リストのリストになります。サブリストがすべて同じサイズであれば、2次元配列を得るには

x_array = np.array(x) 

を得ることができます。しかし、サブリストのサイズが異なる場合、これはdtype=objectの1d配列を生成します。これは、オーバーヘッドがarrayのリストよりもわずかです。たとえば:

In [98]: np.concatenate([[1,2,3],[1,2]]) 
Out[98]: array([1, 2, 3, 1, 2]) 

In [99]: np.array([[1,2,3],[1,2]]) 
Out[99]: array([[1, 2, 3], [1, 2]], dtype=object) 

In [100]: np.array([[1,2,3],[1,2,4]]) 
Out[100]: 
array([[1, 2, 3], 
     [1, 2, 4]]) 

私はこれらの2のグローバル変数、およびリスト{"x": [], "y": []}アプローチの辞書を使用しての間に多くの時間差を期待してはいけません。グローバル変数も辞書に保持されます。

本当の問題は、中間値をリストまたは配列で収集するかどうかです。

関連する問題