2016-10-05 4 views
0

私はライブストリーミングデータを受け取り、numpy配列に追加するPythonスクリプトを作成しています。しかし、私は4つの異なる配列を1つ1つ追加すると動作することに気付きました。例えば:しかしForループを使用してNumpyに追加

openBidArray = np.append(openBidArray, bidPrice) 
highBidArray = np.append(highBidArray, bidPrice) 
lowBidArray = np.append(lowBidArray, bidPrice) 
closeBidArray = np.append(closeBidArray, bidPrice) 

私はそれが動作しない、次のない場合:

arrays = ["openBidArray", "highBidArray", "lowBidArray", "closeBidArray"] 

for array in arrays: 
    array = np.append(array, bidPrice) 

ことがある理由上の任意のアイデア?

+0

ループ内の 'array = ...'は反復変数を再割り当てしますが、ソースリストの値は変更しません。 'arrays [i] = ...'を実行するには、インデックス付きループを使用する必要があります。それが基本的なPythonのループ動作です。 – hpaulj

答えて

1

2番目の例では、np.arrayオブジェクトではなく文字列を使用しています。文字列に数字(?)を追加しようとしています。

文字列 "openBidArray"には、openBidArrayという配列へのリンクがありません。

2

代わりにこれを行います。

arrays = [openBidArray, highBidArray, lowBidArray, closeBidArray] 

言い換えれば、あなたのリストは配列のリストではなく、偶然あなたが定義されているために起こる配列の名前を含む文字列のリストでなければなりません。

次の問題は、np.append()は、場所に追加するのではなく、項目を追加した配列のコピーを返すことです。この結果はarrayに保存されますが、arrayには次の繰り返しでリストの次の項目が割り当てられ、変更された配列は失われます(最後のものはもちろんですが、最後はarrayになります)。ループ)。したがって、変更された各配列をリストに戻して保存する必要があります。そのためには、どのスロットから来たのかを知る必要があります。これはenumerate()で取得できます。

for i, array in enumerate(arrays): 
    arrays[i] = np.append(array, bidPrice) 

は今、もちろん、これはあなたの元の変数、 openBidArrayなどを更新しません。あなたはアンパック使ってループの後にこれを行うことができます:で始まるように

openBidArray, highBidArray, lowBidArray, closeBidArray = arrays 

をしかし、いくつかの点でそれだけで(名前でそれらにアクセスする必要がある場合や辞書)、リスト内の配列を格納する方が理にかなっていると、別々の変数を使用しないでください。

N.B. NumPy配列の代わりに通常のPythonリストを使用した場合、これらの問題のいくつかは消えてしまいます。リスト上のappend()はインプレース操作であるため、変更された配列をリストに戻すか、個々の変数に展開する必要はありません。あなたが実際にそれらの上にNumPyの機能性を必要とするならば、リストを使ってすべての追加を行い、その後それらを配列に変換することは実現可能かもしれません。

+0

ありがとう私はなぜ文字列を使って始めたのか分かりません。しかし、私はそれらを配列名に置き換え、forループを成功させずに実行しました。しかし、forループの 'array'という単語を' closeBidArray'のように配列名に置き換えるとうまくいきます。レコードの場合、forループはクラス内の関数内にあり、配列はクラス外で宣言されます。 – ng150716

+0

この問題の詳細については、質問を更新しました。 – kindall

関連する問題