Numpy: BUG: Das Festlegen der Maske in einer Ansicht mit mask = nomask wird nicht an den Eigentümer weitergegeben

Erstellt am 27. Juni 2016  ·  4Kommentare  ·  Quelle: numpy/numpy

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

00 - Bug numpy.ma

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?

Alle 4 Kommentare

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 entweder nomask (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.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen