2016-08-04 5 views
1

私は初期化したいいくつかの配列を持っています。配列にデータが格納されないように各配列をループしたいのですが、何らかの方法で初期化されますが、データが保持されていればnumpy.stackによって新しいデータが追加されます。 numpy、連結または初期化のループの選択

a = np.array(0) 
b = np.array(0) 
c = np.array(0) 

while True: 

    data_set_num = infile.readline() 
    if not data_set_num: break 

    for arr in (a, b, c): 
     new_arr = get_new_array(infile) 
     try: 
      arr = np.stack((arr, new_arr)) 
     except: 
      arr = np.array(new_arr) 

しかし、ループの実行後に、私は何もありません:私はこれを試してみました bcのための同じ

>>> a.shape 
() 

を。明らかに私はどのようにarrが3つの配列を参照するのか分からなかった。誰でも私がやろうとしていることをする方法を知っていますか?私は、もちろん、内側のループを展開することができますが、それはひどく "unpythonic"と思われます。

+0

バグを修正しても、繰り返しの連結は非常に非効率的に配列を操作する方法です。 – user2357112

+0

'arr'は配列を1つずつ参照します。次に、 'np.stack((arr、new_arr))'または 'np.array(new_arr)'に置き換えられます。どちらも新しい配列を返します。 'arr'という名前は' a'や 'b'や' c'ではなく、新しい参照に束縛されます。 –

+0

@Mad Physicistはい、私は今理解しています。今私の質問は、私は私がする必要があることをどうやって行うのですか?ありがとう。 –

答えて

1

スタッキングを介して配列を連結することが難しいという事実を除いて、コードに名前バインディングの問題を修正する必要があります。

問題はarrが(期待どおりに)配列を1つずつ参照(バインド)されていることです。次に、np.stack((arr, new_arr))またはnp.array(new_arr)に置き換えられ、どちらも新しい配列を返します。 arrという名前は、aまたはbまたはcではなく、新しい参照にバインドされています。

a,b,cの代わりに、配列リストを作成するのが直接の解決方法です。何かのようにしてください

x = [np.array(0) for _ in range(3)] 

while True: 

    data_set_num = infile.readline() 
    if not data_set_num: 
     break 

    for ind, arr in enumerate(x): 
     new_arr = get_new_array(infile) 
     try: 
      x[ind] = np.stack((arr, new_arr)) 
     except: 
      x[ind] = np.array(new_arr) 

ここにはいくつかの大きな欠陥があります。一つのこととして、あなたはtry...exceptをそう単純に使うべきではありません。別の方法として、配列を積み重ねる必要がある場合は、インクリメンタルな再割り当てを行うのではなく、すべてを一度に実行してください。

また、while True:ループ内で同じコードが同じ配列セットに繰り返しループしているように見えます。

1
import numpy as np 
arrays = [] 
while True: 
    #data_set_num = infile.readline() 
    #if not data_set_num: break 
    arr = np.array(0) 
    for count in range(3): 
     #new_arr = get_new_array(infile) 
     new_arr = np.array([[count+1,count+2],[count+3,count+4]]) 
     try: 
      arrays.append(np.stack((arr, new_arr))) 
     except: 
      arrays.append(np.array(new_arr)) 
    break 
print str(arrays[0]) 
print str(arrays[1]) 
print str(arrays[2]) 
+0

'print'は自動的に' str'を呼び出します。最後の3つのステートメントは 'for x in arrays:print x'に減らすことができます。 –

関連する問題