各2x2
サブアレイを分割し、各ウィンドウブロックが2D
アレイの行になるように再編成することができます。 boolean indexing
を使用して、各行からf==1
の位置に対応する要素を抽出します。 次に、抽出されたすべての要素が各行に沿って同一であるかどうかを調べて、マスクを与えます。再構成後の最終バイナリ出力には、このマスクを使用してf
を乗算します。フィルタアレイとしてf
とデータアレイとしてA
、このようになり、このような手順を実行するベクトル実装を想定したがって
、 -
# Setup size parameters
M = A.shape[0]
Mh = M/2
N = A.shape[1]/2
# Reshape input array to 4D such that the last two axes represent the
# windowed block at each iteration of the intended operation
A4D = A.reshape(-1,2,N,2).swapaxes(1,2)
# Determine the binary array whether all elements mapped against 1
# in the filter array are the same elements or not
S = (np.diff(A4D.reshape(-1,4)[:,f.ravel()==1],1)==0).all(1)
# Finally multiply the binary array with f to get desired binary output
out = (S.reshape(Mh,N)[:,None,:,None]*f[:,None,:]).reshape(M,-1)
サンプルラン -
1)入力:
In [58]: A
Out[58]:
array([[1, 1, 1, 1, 2, 1],
[1, 1, 3, 1, 2, 2],
[1, 3, 3, 3, 2, 3],
[3, 3, 3, 3, 3, 1]])
In [59]: f
Out[59]:
array([[0, 1],
[1, 1]])
2)中間出力:
In [60]: A4D
Out[60]:
array([[[[1, 1],
[1, 1]],
[[1, 1],
[3, 1]],
[[2, 1],
[2, 2]]],
[[[1, 3],
[3, 3]],
[[3, 3],
[3, 3]],
[[2, 3],
[3, 1]]]])
In [61]: S
Out[61]: array([ True, False, False, True, True, False], dtype=bool)
3)最終的な出力:
In [62]: out
Out[62]:
array([[0, 1, 0, 0, 0, 0],
[1, 1, 0, 0, 0, 0],
[0, 1, 0, 1, 0, 0],
[1, 1, 1, 1, 0, 0]])
同じアプローチを用いて行うことができる 'np.kron(〜np.any(np.diff(A4D [...、== 1 F])、 -1)、f) ';-) –
@morningsunああ、最後のステップでの乗算のための' kron'!ありがとう! – Divakar