Numpy: np.random.choice gibt einen Index außerhalb des Bereichs für das maskierte Array prob zurück.

Erstellt am 15. Aug. 2020  ·  6Kommentare  ·  Quelle: numpy/numpy

import numpy as np

a = np.array([0.1, 0.2, 0.4, 0.3])
masked_a = np.ma.masked_array(a, [0, 0, 1, 1])
counter = np.zeros(len(a) + 1)
while True:
    action = np.random.choice(len(a), p=masked_a)
    counter[action] += 1
    print(counter / counter.sum())

# [0.09931198 0.20076697 0.         0.         0.69992105]

Es sollte keinen Index> 3 zurückgeben, aber wenn das letzte Element des maskierten Arrays wahr ist, wird möglicherweise index = 4 zurückgegeben

00 - Bug numpy.ma numpy.random

Alle 6 Kommentare

Das Problem tritt auch in Generator.choice in der Entwicklungsversion von numpy auf:

In [1]: import numpy as np

In [2]: np.__version__ 
Out[2]: '1.20.0.dev0+986e533'

In [3]: rng = np.random.default_rng()

In [4]: pm = np.ma.masked_array([0.1, 0.2, 0.4, 0.3], mask=[0, 0, 1, 1])

In [5]: rng.choice(4, p=pm, size=12)
Out[5]: array([4, 4, 4, 0, 4, 1, 4, 0, 0, 4, 4, 4])

Früher habe ich das "Bug" -Label hinzugefügt, aber das ist ein subjektives Urteil. Es gibt andere Funktionen in numpy, die maskierte Arrays nicht richtig behandeln (oder besser "richtig", da "Korrektheit" auch ein Beurteilungsaufruf sein kann), bei denen wir es nicht unbedingt als Fehler betrachten. Vielleicht ist dies nur ein Beispiel für undefiniertes Verhalten, und die kurze Antwort auf das Problem lautet "Tu das nicht!". Es wäre jedoch schöner, wenn wir eine Ausnahme auslösen könnten, anstatt unsinnige Ergebnisse zurückzugeben.

Es wäre einfach genug, eine explizite Prüfung für ein maskiertes Array hinzuzufügen und einen Fehler auszulösen, wenn einer der Werte tatsächlich maskiert ist. Dies scheint jedoch eine sehr spezifische Ad-hoc-Korrektur zu sein.

Versendet Generator.choice an __array_function__ ? Wenn nicht, sollte es wahrscheinlich.

Wenn ja, dann werfen wir dies einfach mit all den anderen "Maskedarray-Zerfällen" zusammen, weil wir noch keine __array_function__ -Bugs implementiert haben.

Früher habe ich das "Bug" -Label hinzugefügt, aber das ist ein subjektives Urteil. Es gibt andere Funktionen in numpy, die maskierte Arrays nicht richtig behandeln (oder besser "richtig", da "Korrektheit" auch ein Beurteilungsaufruf sein kann), bei denen wir es nicht unbedingt als Fehler betrachten. Vielleicht ist dies nur ein Beispiel für undefiniertes Verhalten, und die kurze Antwort auf das Problem lautet "Tu das nicht!". Es wäre jedoch schöner, wenn wir eine Ausnahme auslösen könnten, anstatt unsinnige Ergebnisse zurückzugeben.

Es wäre einfach genug, eine explizite Prüfung für ein maskiertes Array hinzuzufügen und einen Fehler auszulösen, wenn einer der Werte tatsächlich maskiert ist. Dies scheint jedoch eine sehr spezifische Ad-hoc-Korrektur zu sein.

Ich denke, wenn es nicht richtig damit umgeht, sollte es nicht zulassen, dass ein maskiertes Array übergeben wird (sollte eine Ausnahme auslösen), aber es funktioniert meistens korrekt (es funktioniert gut, außer in einigen Fällen). Dies kann potenzielle Probleme für die Produktionsumgebung verursachen.

Es gibt keine Verwendung von __array_function__ in Generator . Während viele Krafteingaben C-zusammenhängend gut benehmen, ist es wahrscheinlich so, dass einige Funktionen dies nicht immer religiös genug erzwingen.

Wenn Sie NPY_ARRAY_ENSUREARRAY hinzufügen, erhalten Sie ein ndarray, das voll ist und die Maske ignoriert. Schwer zu sagen, dass dies "richtig" ist. Im Beispiel von @WarrenWeckesser werden letztendlich pm=np.array([.1,.2,.3,.4]) als Wahrscheinlichkeiten verwendet.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

dmvianna picture dmvianna  ·  4Kommentare

marcocaccin picture marcocaccin  ·  4Kommentare

Foadsf picture Foadsf  ·  3Kommentare

dcsaba89 picture dcsaba89  ·  3Kommentare

qualiaa picture qualiaa  ·  3Kommentare