Numpy: np.floor_divide lässt den Imaginärteil lautlos fallen

Erstellt am 1. Apr. 2019  ·  13Kommentare  ·  Quelle: numpy/numpy

Beispiel für die Wiedergabe von Code:

import numpy as np
a = np.arange(10) + 1j* np.arange(10)
a
# array([0.+0.j, 1.+1.j, 2.+2.j, 3.+3.j, 4.+4.j, 5.+5.j, 6.+6.j, 7.+7.j,
#           8.+8.j, 9.+9.j])
a / 2
# array([0. +0.j , 0.5+0.5j, 1. +1.j , 1.5+1.5j, 2. +2.j , 2.5+2.5j,
#          3. +3.j , 3.5+3.5j, 4. +4.j , 4.5+4.5j])
a // 2
# array([0.+0.j, 0.+0.j, 1.+0.j, 1.+0.j, 2.+0.j, 2.+0.j, 3.+0.j, 3.+0.j,
#          4.+0.j, 4.+0.j])

Gibt es einen besonderen Grund für dieses Verhalten? Ich würde erwarten, den imaginären und komplexen Teil zu unterteilen.

Fehlermeldung:

Es wird kein Fehler oder eine Warnung ausgegeben, auch nicht der Imaginärteil geht verloren.

Informationen zur Numpy / Python-Version:

1.16.1
3.6.7 (Standard, 22. Oktober 2018, 11:32:17)
[GCC 8.2.0]

00 - Bug 15 - Discussion numpy.ufunc

Alle 13 Kommentare

Sie können keine Floor-Funktion für komplexe Zahlen haben.
Etage komplexer Zahlen
Außerdem teilen wir den Imaginärteil und den komplexen Teil nicht getrennt. Wir erhalten eine komplexe Zahl, wenn wir zwei komplexe Zahlen teilen. ( Komplexe Zahlen teilen )

Ebenfalls ,
`>>> (1. + 1.j) // 2

Traceback (letzter Anruf zuletzt):
Datei "", Zeile 1, in
TypeError: Kann die komplexe Zahl nicht erfassen. "

Ähnlich sollte TypeError angezeigt werden .
Ich bin neu bei Open Source. Ich würde es gerne machen. Kann mich jemand führen?

Numpy kann komplexe Zahlen nicht erfassen. Statt einen Fehler zu machen, wird einfach der Imaginärteil gelöscht. Ich denke, Numpy funktioniert gut

Ok, ich dachte, es wäre wert, zumindest eine Warnung zu werfen, dass der Imaginärteil fallen gelassen wird, ähnlich wie bei anderen Funktionen.

Normale Python wirft einen Fehler, scheint, wir sollten wahrscheinlich nachziehen, es sei denn, jemand kann sich einen Anwendungsfall vorstellen?

Ja, ich denke wir sollten einen TypeError werfen.
Kann ich daran arbeiten?

Persönlich würde ich sogar ein (2 + 2j) // 2 = (1 + 1j) bevorzugen, obwohl es mathematisch nicht perfekt korrekt ist.

Nicht sicher, was am besten ist, Rest ist einfach nicht für komplexe implementiert (wirft einen Fehler). Und wenn wir einen Fehler machen, sollten wir vielleicht zuerst ablehnen.

Natürlich können Sie daran arbeiten, es wird erforderlich sein, ein wenig in die Funktionsweise und Generierung von Ufuncs einzutauchen, so dass dies möglicherweise nicht ganz trivial ist. Außerdem ist möglicherweise noch eine Diskussion darüber erforderlich, wohin wir wollen. Das muss dich aber nicht aufhalten.

"Lehnen Sie angesichts der Zweideutigkeit die Versuchung ab, zu raten." schlägt vor, dass es ein TypeError .

@ kaivu1999 - beheben , ist es wahrscheinlich am besten, die komplexen Typen nicht mehr im floor_divide ufunc zu generieren (beachten Sie, dass divmod , remainder und modf sind schon OK). Schauen Sie in core/src/umath/loops.c.src , in Sachen, die der Zeile 2321 folgen (wahrscheinlich entfernen Sie einfach die Zeilen 2480-2500).

@mhvk Ja, Sie müssen auch numpy/core/code_generators/generate_umath.py anpassen, aber wenn wir zuerst veralten möchten, müssen Sie wahrscheinlich einen benutzerdefinierten Resolver erstellen (berührt zusätzlich numpy/core/src/umath/ufunc_type_resolution.c ).

@seberg - es scheint, dass das gegenwärtige Verhalten wirklich nur als Fehler betrachtet werden sollte, und dass wir aus remainder und divmod einen Fehler auslösen sollten.

Ob wir ein anderes Verhalten wollen, scheint eine separate Diskussion zu sein.

Ja, ich bin dabei.
Ich habe den Code so geändert, und jetzt zeigt es:
`>>> a // 2

Traceback (letzter Anruf zuletzt):
Datei "", Zeile 1, in
TypeError: ufunc 'floor_divide' wird für die Eingabetypen nicht unterstützt, und die Eingaben konnten gemäß der Casting-Regel '' safe '' nicht sicher zu unterstützten Typen gezwungen werden.
`
Soll ich die Pull-Anfrage generieren?

@ kaivu1999 eine Pull-Anfrage wäre ein guter Anfang. Bitte stellen Sie sicher, dass Fixes #13236 in den ersten Kommentar eingefügt wird, der auf das Problem und die PR verweist.

Eine Bodenteilung sowohl für Real- als auch für Imaginärteile ist sinnvoll, wenn wir dokumentieren, dass Gaußsche Ganzzahlen das Ergebnis sind. Das würde allerdings nicht mit Python übereinstimmen.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

sturlamolden picture sturlamolden  ·  68Kommentare

ghost picture ghost  ·  49Kommentare

ricardoV94 picture ricardoV94  ·  53Kommentare

mrava87 picture mrava87  ·  53Kommentare

anntzer picture anntzer  ·  45Kommentare