Hier ist das Problem, auf das ich während meiner Arbeit stoße
Das Problem mit der Maske, wenn sie nicht eingestellt ist
>>> a =np.arange(6,dtype=np.float64).reshape((2,3))
>>> a
array([[ 0., 1., 2.],
[ 3., 4., 5.]])
>>> am = np.ma.masked_array(a)
>>> am
masked_array(data =
[[ 0. 1. 2.]
[ 3. 4. 5.]],
mask =
False,
fill_value = 1e+20)
>>> am[0][1]=np.ma.masked
>>> am
masked_array(data =
[[ 0. 1. 2.]
[ 3. 4. 5.]],
mask =
False,
fill_value = 1e+20)
###--------- doesn't work----------------
>>> am[0,1]=np.ma.masked
>>> am
masked_array(data =
[[0.0 -- 2.0]
[3.0 4.0 5.0]],
mask =
[[False True False]
[False False False]],
fill_value = 1e+20)
###-------this way it works---------
>>> am[1][1]=np.ma.masked
>>> am
masked_array(data =
[[0.0 -- 2.0]
[3.0 -- 5.0]],
mask =
[[False True False]
[False True False]],
fill_value = 1e+20)
###--------now it surprisingly works again--
Linux 3.19.8-100.fc20.x86_64
Python 2.7.5
>>> np.__version__
'1.8.2'
Ich weiß, dass mein System nicht auf dem neuesten Stand ist, aber ich habe einen Freund gefragt, der hat
und er bestätigt, dass dieses Problem besteht
Bestätigt im Master (1.12). Dies ist wie das, was # 5580 zu beheben hoffte, aber wie dort besprochen, kann dieser spezielle Fall nicht ohne eine Überarbeitung von MaskedArray behoben werden, um np.nomask
zu entfernen.
Hier ist das Problem: MaskedArrays speichern die Maske manchmal als Array von Booleschen Werten und manchmal (wenn keine maskierten Werte vorhanden sind) die Maske einfach als Wert False
(und np.nomask == False).
Das Problem ist, dass beim Schneiden eines MaskedArray (und beim Abrufen einer Ansicht) die Maske nur "angezeigt" werden kann, wenn es sich derzeit um ein Array von Booleschen Werten handelt, nicht jedoch, wenn es sich um die Konstante "False" handelt. Wenn Sie also zum ersten Mal am[0][1] = ...
ausprobieren, ist die Maske die Konstante "False" und kann nicht angezeigt werden, wird also nicht aktualisiert. Beim zweiten Versuch wird die Maske als Array von Booleschen Werten gespeichert, damit sie angezeigt und aktualisiert werden kann.
Fügen Sie dies der langen Liste der Fehler hinzu, die durch dieses nomask
-Design verursacht wurden, z. B. # 7588.
Jedes Mal, wenn ich an nomask
denke, denke ich auch an das Zitat von Donald Knuth: "Vorzeitige Optimierung ist die Wurzel allen Übels."
Es scheint mir, dass nomask
keine Ausnahme ist. Die Anzahl ungewöhnlicher Fälle, auf die man bei diesem Verhalten stößt, ist ziemlich groß und wird dadurch schwieriger zu beheben.
Wenn es wirklich so produktiv wäre zu wissen, ob die Maske trivial ist oder nicht, könnten wir genauso gut eine Methode wie has_mask
, die das Ergebnis zwischenspeichert.
Gibt es ein Interesse daran, nomask
sofort zu entfernen?
Ich möchte darauf hinweisen, dass ich auch auf dieses Problem gestoßen bin. Es kann sinnvoll sein, einen Hinweis in die Dokumentation aufzunehmen . Das Folgende legt mir nahe, dass durch Ändern der Maske einer Ansicht die Maske des Originals geändert wird.
Beim Zugriff auf ein Slice ist die Ausgabe ein maskiertes Array, dessen Attribut
data
eine Ansicht der Originaldaten ist und dessen Maske entwedernomask
(wenn das ursprüngliche Array keine ungültigen Einträge enthält). oder eine Ansicht des entsprechenden Schnitts der Originalmaske. Die Ansicht ist erforderlich, um die Weitergabe von Änderungen der Maske an das Original sicherzustellen.
Gibt es ein Interesse daran, Nomask endgültig zu entfernen?
Vielleicht auch masked
. Dies ist wahrscheinlich darauf zurückzuführen, dass entweder einige große Änderungen an maskierten Arrays vorgenommen oder eine neue Klasse insgesamt implementiert werden. Könnte es wert sein, eine NEP zusammenzustellen. Ich verwende selten maskierte Arrays, daher ist dies am besten für Leute geeignet, die die Funktionalität benötigen.
Hilfreichster Kommentar
Jedes Mal, wenn ich an
nomask
denke, denke ich auch an das Zitat von Donald Knuth: "Vorzeitige Optimierung ist die Wurzel allen Übels."Es scheint mir, dass
nomask
keine Ausnahme ist. Die Anzahl ungewöhnlicher Fälle, auf die man bei diesem Verhalten stößt, ist ziemlich groß und wird dadurch schwieriger zu beheben.Wenn es wirklich so produktiv wäre zu wissen, ob die Maske trivial ist oder nicht, könnten wir genauso gut eine Methode wie
has_mask
, die das Ergebnis zwischenspeichert.Gibt es ein Interesse daran,
nomask
sofort zu entfernen?