事前に割り当てて埋めます。これにより、実行時のフォームが約 1000 秒から 20 秒に短縮されました
data_stack = numpy.empty((321, 720, 1000), dtype=numpy.float32)
for index in range(len(data)):
data_stack[0:321,0:720,index] = data[index]
私は似たようなことをしていました。dstack は、この問題の適切な解決策ではありません。同僚が動的配列問題と償却分析を思い出させてくれました。 http://anh.cs.luc.edu/363/notes/06A_Amortizing.html
動的配列を拡張する場合は、元のデータと新しいデータを保持できる新しい配列を割り当てる必要があります。次に、古い配列を新しい配列にコピーし、新しいデータを新しい配列にコピーします。それは高価な操作です。
サイズ 10 の配列があり、一度に 2 つの項目を 1 つずつ追加するとします。最初のアイテムを追加するには、配列をサイズ 11 に拡張し、11 個のアイテム (元の 10 + 1 個の新しいアイテム) をコピーする必要があります。2 番目のアイテムを追加するには、配列をサイズ 12 に拡張し、12 個のアイテムをコピーする必要があります。2 つの項目を追加することが前もってわかっていれば、最初に配列のサイズを 12 に変更し、合計 23 項目ではなく 12 項目のみをコピーすることができます。より効率的なソリューションです。
これがどのように適用されるか: dstack は ndarray のサイズを 2 倍にするのではなく、必要な量のメモリのみを割り当てることを意図しています。したがって、dstack を呼び出すたびに、ndarray にあるすべてのデータを、新しいデータ用のスペースを持つ新しい ndarray にコピーします。呼び出しごとに dstack の時間が増加することに注意してください。