2016-04-19 24 views
1

Ich habe diese 3x3-Matrix:Mask Minimalwerten in Matrixzeilen

a=array([[ 1, 11, 5], 
    [ 3, 9, 9], 
    [ 5, 7, -3]]) 

Ich brauche die Minimalwerte in jeder Zeile, um zu maskieren, den Mittelwert jeder Zeile Verwerfen der Minimalwerte zu berechnen. Gibt es eine allgemeine Lösung? Ich habe versucht, mit

a_masked=np.ma.masked_where(a==np.ma.min(a,axis=1),a) 

Welche Masken den Minimalwert in der ersten und dritten Reihe, aber nicht die zweite Reihe?

Ich würde jede Hilfe zu schätzen wissen. Vielen Dank!

Antwort

1

Das Problem ist, weil der Vergleich a == a.min(axis=1) wird jede Spalte auf den Minimalwert jeder Zeile zu vergleichen, anstatt jede Zeile zu den Minimalwerten zu vergleichen. Dies liegt daran, dass a.min(axis=1) einen Vektor anstelle einer Matrix zurückgibt, die sich ähnlich wie ein Nx1 Array verhält. Daher führt der Operator == beim Senden die Operation in einer spaltenweisen Weise aus, um den Dimensionen zu entsprechen.

a == a.min(axis=1) 

# array([[ True, False, False], 
#  [False, False, False], 
#  [False, False, True]], dtype=bool) 

Eine mögliche Art und Weise, dies zu beheben, ist auf das Ergebnis resizea.min(axis=1) in Spaltenvektor (beispielsweise eine 3 x 1 2D-Array).

a == np.resize(a.min(axis=1), [a.shape[0],1]) 

# array([[ True, False, False], 
#  [ True, False, False], 
#  [False, False, True]], dtype=bool) 

Oder einfacher als @ColonelBeuvel gezeigt hat:

a == a.min(axis=1)[:,None] 
Anwendung dieser

nun auf Ihre gesamte Zeile Code.

a_masked = np.ma.masked_where(a == np.resize(a.min(axis=1),[a.shape[0],1]), a) 

# masked_array(data = 
# [[-- 11 5] 
# [-- 9 9] 
# [5 7 --]], 
#  mask = 
#   [[ True False False] 
#   [ True False False] 
#   [False False True]], 
#   fill_value = 999999) 
+0

Danke für die Erklärung! Es funktioniert jetzt, dank @Colonel Beauvel sowie –

+0

Ich habe eine zusätzliche Frage tatsächlich. Was ist, wenn ich eine Zeile mit zwei oder drei gleichen Elementen habe, zum Beispiel: a = Array ([[7, 5, 5], [3, 6, 9], [5, 1, 1]]) Wie kann ich nur einen der Mindestwerte maskieren und nicht alle? –

+0

Kannst du mir auch helfen? @ ColonelBeuvel –

0

Was ist mit der Funktion min()?

Für jede Zeile tun Sie einfach min (Zeile) und es gibt Ihnen das Minimum dieser Liste in Ihrem Fall eine Zeile. Hängen Sie dieses Minimum einfach in eine Liste für alle Minimum an.

minList = []

for i in array: minList.append(min(i))

+0

Nein, nein und nein. For-Schleifen sind für solche Operationen "verboten". –

+0

Kannst du mir in den Kommentaren oben in der anderen Antwort helfen? @ ColonelBeuvel –