numpy
の配列をスライスして、2番目の要素(行で交互に)をすべて抽出するというエレガントな方法はありますか? X
手段は、この要素を抽出し-
はない交互に2つの要素があるナンシースライスの2D配列
[[ X, - , X , -],
[ -, X , - , X],
[ X, - , X , -],
[ -, X , - , X],
...]]
:
例えば抽出パターン(幅と高さが2の倍数であると仮定)。
結果は、元の配列の半分の幅または高さの半分になります。
numpy
の配列をスライスして、2番目の要素(行で交互に)をすべて抽出するというエレガントな方法はありますか? X
手段は、この要素を抽出し-
はない交互に2つの要素があるナンシースライスの2D配列
[[ X, - , X , -],
[ -, X , - , X],
[ X, - , X , -],
[ -, X , - , X],
...]]
:
例えば抽出パターン(幅と高さが2の倍数であると仮定)。
結果は、元の配列の半分の幅または高さの半分になります。
単純な機能でこれらの要素に対処する方法がないため、ストライドではこれを行う方法はありません。
マスクが行く方法だろう。これはかなり上品です:
>>> arr = np.random.random_integers(0,9, (4,4))
>>> mask = np.fromfunction(lambda i, j: (i+j)%2 ==0 , arr.shape, dtype=int)
>>> np.ma.masked_array(arr, mask=~mask)
masked_array(data =
[[0 -- 1 --]
[-- 7 -- 6]
[9 -- 9 --]
[-- 1 -- 3]],
mask =
[[False True False True]
[ True False True False]
[False True False True]
[ True False True False]],
fill_value = 999999)
最後の行はデモンストレーション用です。データを抽出する場合は、索引付け:arr[mask]
を使用します。必要に応じてreshape(arr.shape[0]//2, -1)
を2次元で戻します。このメソッドは、配列の幅と高さが2
の倍数でないときにも動作しますしばらく試した後、私はまた、元の配列
x = np.random.random((6,4))
res = np.vstack(zip(x[0::2, 0::2], x[1::2, 1::2])).reshape((x.shape[0], x.shape[1]//2))
の幅を半減します答えを見つけました