2016-07-22 47 views
1

Bei einem t1xt2xn-Array und einer m1xm2-Maske, wie erhält man das t1xt2xn-Array, in dem die n-dim-Arrays mit der Maske gefaltet sind?Wie falten Array von Arrays mit einer Maske in Python?

Die Funktion scipy.signal.convolve kann dies nicht verarbeiten, da sie nur Eingaben mit der gleichen Anzahl von Dimensionen akzeptiert.

Beispiel mit der „gleichen“ Logik:

in1 = 
[[[0,1,2],[3,4,5],[6,7,8]], 
[[9,10,11],[12,13,14],[15,16,17]], 
[[18,19,20],[21,22,23],[24,25,26]]] 

in2 = 
[[0,1,0], 
[0,1,0], 
[0,1,0]] 

output = 
[[[0,0,0],[15,17,19],[0,0,0]], 
[[0,0,0],[36,39,42],[0,0,0]], 
[[0,0,0],[33,35,37],[0,0,0]]] 
+0

Ist die Form Ihrer m1xm2-Maske (t1, t2)? – frist

+0

@frist Nicht unbedingt: m1 <= t1 und m2 <= t2 –

+0

Also wie soll es funktionieren? Können Sie uns eine Beispieleingabe von t1xt2xn, m1xm2 und erwartetem Ergebnis des Convolving geben? – frist

Antwort

0

Ich bin sehr traurig, aber ich habe nicht stark Mathematik Hintergrund, so könnte meine Antwort falsch sein. Wie auch immer, wenn Sie die Maske zum Auswählen verwenden müssen, sollten Sie sie in bool type konvertieren. Zum Beispiel:

in1 = np.array([[[0,1,2], [3,4,5], [6,7,8]], 
       [[9,10,11], [12,13,14], [15,16,17]], 
       [[18,19,20], [21,22,23], [24,25,26]]]) 

in2 = np.array([[0, 1, 0], 
       [0, 1, 0], 
       [0, 1, 0]]) 

mask = in2.astype(bool) 

print(in1[mask]) 
# [[ 3 4 5] 
# [12 13 14] 
# [21 22 23]] 

in3 = np.zeros(in1.shape) 

in3[mask] = np.convolve(in1[mask].ravel(), in2.ravel(), 'same').reshape(mask.shape) 

print(in3) 

# [[[ 0. 0. 0.] 
# [ 15. 17. 19.] 
# [ 0. 0. 0.]] 
# 
# [[ 0. 0. 0.] 
# [ 36. 39. 42.] 
# [ 0. 0. 0.]] 
# 
# [[ 0. 0. 0.] 
# [ 33. 35. 37.] 
# [ 0. 0. 0.]]] 

Ich bin nicht sehr sicher letzten Teil, vor allem über Umformen, aber ich hoffe, dass Sie eine Vorstellung bekommen.