3

次のような機能があります。

def Function(x):
   a = random.random()
   b = random.random()
   c = OtherFunctionThatReturnsAThreeColumnArray()
   results = np.zeros((1,5))
   results[0,0] = a
   results[0,1] = b
   results[0,2] = c[-1,0]
   results[0,3] = c[-1,1]
   results[0,4] = c[-1,2]
   return results

私がやろうとしているのは、この関数を何度も実行し、返された 1 行、5 列の結果を実行中のデータ セットに追加することです。しかし、append 関数と for ループは、私が理解しているようにどちらも破滅的に非効率的であり、コードを改善しようとしていますが、実行回数が十分に大きくなるため、そのような非効率性は私には効果がありません。どんな好意でも。

オーバーヘッドを最小限に抑えるために、次のことを行う最善の方法は何ですか?

  1. 結果を保持するために新しい numpy 配列を作成します
  2. その関数の N 回の呼び出しの結果を 1 の配列に挿入しますか?
4

1 に答える 1

2

numpy.appendまたは、何度も繰り返すと費用がかかると考えるのは正しいですnumpy.concatenate(これは、numpy が前の 2 つの配列に対して新しい配列を宣言することに関係しています)。

最善の提案 (合計でどれくらいのスペースが必要になるかがわかっている場合) は、ルーチンを実行する前にそれを宣言し、結果が利用可能になったらそのまま配置することです。

今回走るならnrows

results = np.zeros([nrows, 5])

次に、結果を追加します

def function(x, i, results):
    <.. snip ..>
    results[i,0] = a
    results[i,1] = b
    results[i,2] = c[-1,0]
    results[i,3] = c[-1,1]
    results[0,4] = c[-1,2]

もちろん、関数を何回実行するかわからない場合、これは機能しません。その場合、あまりエレガントではないアプローチをお勧めします。

  1. おそらく大きなresults配列を宣言しresults[i, x]、上記のように追加します(結果の追跡iとサイズを維持します。

  2. のサイズに達したら、新しい配列で(または) をresults実行します。これは、繰り返し追加するよりも悪くなく、パフォーマンスを損なうことはありませんが、ラッパー コードを記述する必要があります。numpy.appendconcatenate

あなたが追求できる他のアイデアがあります。あなたができる私の頭の上から

  1. OtherFunctionThatReturnsAThreeColumnArrayデータの速度とサイズに応じて、結果をディスクに書き込みます。

  2. 結果をリスト内包表記に保存します (numpy実行後まで忘れます)。関数が (a、b、c) を返した場合、結果はありません。

results = [function(x) for x in my_data]

次にシャッフルを行い、結果を必要な形式にします。

于 2013-02-24T13:12:52.900 に答える