これはビット原油と厄介な感じ、それはループせずに作業を行います。
二つの主要なタスクがあります。
- ので、それは
masks
でインデックスを作成することができdata
を拡大 - (5,4)から(5,3,4)へ
- は、行のグループに
means
を適用します。私が見つけられる最も近いものはnp.sum.reduceat
です。
reduceat
インデックス構築:
In [253]: cnt = masks.sum(axis=1)
In [254]: cnt1=np.concatenate(([0],np.cumsum(cnt)[:-1]))
In [255]: cnt
Out[255]: array([2, 1, 2, 1, 2]) # True count per row
In [256]: cnt1
Out[256]: array([0, 2, 3, 5, 6]) # reduceat index positions
はdata
とmask
を展開:
In [257]: mdata=data[None,...].repeat(masks.shape[0],0)[masks,:]
add
行と分割行数によりグループ毎
を
それが助け場合:
In [263]: mdata
Out[263]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 4, 5, 6, 7],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[ 0, 1, 2, 3],
[ 0, 1, 2, 3],
[ 8, 9, 10, 11]])
Aこのmdata
が
In [285]: data[np.where(masks)[1],:]
Out[285]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 4, 5, 6, 7],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[ 0, 1, 2, 3],
[ 0, 1, 2, 3],
[ 8, 9, 10, 11]])
where(...)[1]
が我々の行ですmasks
における真の列位置、あるあるを取得する可能性がより良い方法data
から選択してください。
===========================
@capitalistcuttle
も(5,3,4)アレイを作成したが、 False
行をゼロにしてreduceat
の必要性を回避します。そうすれば、価値に影響を与えることなくmean
またはsum
に入ることができます。これは、マスクされた配列がこのようなタスクをどのように実行するかを思い起こさせます。それらはfill
で、0または1のような値を持つマスクされた値は計算に影響しません。
In [322]: data1=data[None,:,:].repeat(5,0)
In [323]: masks1=masks[:,:,None].repeat(4,-1)
In [324]: data1.shape, masks1.shape
Out[324]: ((5, 3, 4), (5, 3, 4))
ことからマスクされた配列行います:
In [325]: madata=np.ma.MaskedArray(data1,~masks1)
In [326]: madata
Out[326]:
masked_array(data =
[[[0 1 2 3]
[4 5 6 7]
[-- -- -- --]]
[[-- -- -- --]
[4 5 6 7]
[-- -- -- --]]
...
[[0 1 2 3]
[-- -- -- --]
[8 9 10 11]]],
mask =
[[[False False False False]
[False False False False]
[ True True True True]]
[[ True True True True]
[False False False False]
[ True True True True]]
...],
fill_value = 999999)
をその触発され
はここMaskedArrayソリューション
が(5,3,4)のサイズにdata
とmasks
の両方を展開します
今度はmean
メソッドを使用して、0の塗りつぶしを処理し、有効な行の数を調整します。 .data
属性は、通常の配列に戻って変換すること
In [327]: madata.mean(axis=1)
Out[327]:
masked_array(data =
[[2.0 3.0 4.0 5.0]
[4.0 5.0 6.0 7.0]
[6.0 7.0 8.0 9.0]
[0.0 1.0 2.0 3.0]
[4.0 5.0 6.0 7.0]],
mask =
[[False False False False]
[False False False False]
[False False False False]
[False False False False]
[False False False False]],
fill_value = 1e+20)
。
このMaskedArrayアプローチは、より大きい配列を作成するため、おそらく遅くなりますが、より一般的である可能性があります。np.ma
またはそのメソッドで定義されている限り、操作を使用できます。
投稿されたアプローチをすべて試しましたか?誰かがあなたのために働いたのですか?実際の入力設定のようなランタイム番号は何ですか? – Divakar
謝罪、はい、それらを試してみました。あなたのものは具体的には手段の中で最速だったし、私が下で説明したような放送は他の機能のために働く。 – capitalistcuttle