あなたの内側のループが1Dビューに取り組んでいるように見え、そのようにコード化することができます(その場合は
In [386]: values=np.random.randint(0,10,20)
In [387]: values
Out[387]: array([1, 5, 9, 4, 6, 7, 1, 5, 6, 4, 4, 3, 9, 5, 8, 5, 0, 3, 1, 2])
In [388]: np.amin?
In [389]: for x in range(1,len(values)):
...: if values[x]<5:
...: values[x]=values[x-1]
...:
In [390]: values
Out[390]: array([1, 5, 9, 9, 6, 7, 7, 5, 6, 6, 6, 6, 9, 5, 8, 5, 5, 5, 5, 5])
、一つの目標は、おそらくufunc accumulate
機能の一つで、これをスピードアップすることですcumsum
の動作を考えてください)。
次の質問は、他の2次元の反復を避けることができるかどうかです。いくつかの転調と変形によって、それを1dの反復に凝縮することができますが、それは時間を節約しません。そして、3dよりも2次元アレイ上でアイデアをテストする方が簡単です。
私はapply_along_axis
の反復の詳細を処理するように提案していましたが、その場では機能しませんし、out
パラメータを使用することもできません)。
=======================
はのは、2次元配列のすべての値にこのアクションを適用してみましょう。
In [398]: val2d=np.array((x1,x1+2, x1-2))
In [399]: val2d
Out[399]:
array([[ 1, 5, 9, 4, 6, 7, 1, 5, 6, 4, 4, 3, 9, 5, 8, 5, 0, 3, 1, 2],
[ 3, 7, 11, 6, 8, 9, 3, 7, 8, 6, 6, 5, 11, 7, 10, 7, 2, 5, 3, 4],
[-1, 3, 7, 2, 4, 5, -1, 3, 4, 2, 2, 1, 7, 3, 6, 3, -2, 1, -1, 0]])
In [400]: for i in range(1,val2d.shape[1]):
...: mask = val2d[:,i]<5
...: val2d[mask,i]=val2d[mask,i-1]
...:
In [401]: val2d
Out[401]:
array([[ 1, 5, 9, 9, 6, 7, 7, 5, 6, 6, 6, 6, 9, 5, 8, 5, 5, 5, 5, 5],
[ 3, 7, 11, 6, 8, 9, 9, 7, 8, 6, 6, 5, 11, 7, 10, 7, 7, 5, 5, 5],
[-1, -1, 7, 7, 7, 5, 5, 5, 5, 5, 5, 5, 7, 7, 6, 6, 6, 6, 6, 6]])
そして、この3Dバージョンは(テストしていない)動作するはず:
for i in range(1, B.shape[1]):
mask = B[:,i,:]<vmin
I,J = np.where(mask)
B[I,i,J] = B[I,i-1,J]
ん '' 'mask'' '' 'B'''と同じくらい多くのメモリを消費しますか? – wwii
@wwii '8 '倍ではなく、' m1'がブール配列であるのと同じですが、 'm2'はおそらく' B'と同じです。質問者のシステムメモリに合うといいでしょう:) – Divakar
OPにはメモリの制約があります。 – wwii