Warum hat Python keine Vorzeichenfunktion?

240

Ich kann nicht verstehen, warum Python keine signFunktion hat. Es hat ein abseingebautes (was ich als signSchwester betrachte), aber neinsign .

In Python 2.6 gibt es sogar eine copysignFunktion (in Mathe ), aber kein Vorzeichen. Warum sich die Mühe machen, eine zu schreiben, copysign(x,y)wenn man einfach eine schreiben signund dann die copysigndirekt von bekommen könnte abs(x) * sign(y)? Letzteres wäre viel klarer: x mit dem Vorzeichen von y, während Sie beim Copysign daran denken müssen, ob es x mit dem Vorzeichen von y oder y mit dem Vorzeichen von x ist!

Offensichtlich sign(x)bietet nichts mehr alscmp(x,0) , aber es wäre viel besser lesbar als dies (und für eine gut lesbare Sprache wie Python wäre dies ein großes Plus gewesen).

Wenn ich ein Python-Designer wäre, wäre ich umgekehrt: kein cmpeingebauter, aber ein sign. Wenn Sie brauchen cmp(x,y), können Sie einfach ein sign(x-y)(oder, noch besser für nicht numerische Dinge, nur ein x> y - natürlich hätte dies das sortedAkzeptieren eines Booleschen Wertes anstelle eines ganzzahligen Komparators erfordern müssen ). Dies wäre auch klar: positiv , wenn x>y(während bei cmpIhnen müssen die Konvention positiv erinnern , als der erste ist größer , aber es könnte umgekehrt sein). Natürlichcmp macht es aus anderen Gründen Sinn (z. B. beim Sortieren nicht numerischer Dinge oder wenn Sie möchten, dass die Sortierung stabil ist, was mit einem einfachen Booleschen Wert nicht möglich ist).

Die Frage ist also: Warum haben die Python-Designer beschlossen, die signFunktion aus der Sprache herauszulassen? Warum zum Teufel mit copysignund nicht mit seinen Eltern ?sign ?

Vermisse ich etwas

EDIT - nach Peter Hansen Kommentar. Fair genug, dass Sie es nicht benutzt haben, aber Sie haben nicht gesagt, wofür Sie Python verwenden. In 7 Jahren, in denen ich Python benutze, brauchte ich es unzählige Male, und der letzte ist der Strohhalm, der dem Kamel den Rücken gebrochen hat!

Ja, Sie können cmp weitergeben, aber 90% der Fälle, in denen ich es weitergeben musste, waren in einer solchen Sprache lambda x,y: cmp(score(x),score(y)), die mit sign gut funktioniert hätte.

Schließlich hoffe ich, dass Sie zustimmen, dass signdies nützlicher wäre als copysign. Selbst wenn ich Ihre Ansicht gekauft hätte, warum sollten Sie sich die Mühe machen, dies in Mathematik zu definieren, anstatt zu unterschreiben? Wie kann Copysign so nützlich sein als Sign?

Davide
quelle
33
@dmazzoni: Würde dieses Argument nicht für alle Fragen auf dieser Seite funktionieren? Schließen Sie einfach den Stackoverflow und stellen Sie jede Frage an den entsprechenden Entwickler oder die Benutzer-Mailingliste!
Davide
43
Der richtige Ort für eine Frage ist jeder Ort, an dem sie wahrscheinlich beantwortet wird. Somit ist der Stapelüberlauf ein geeigneter Ort.
Stefano Borini
23
-1: @Davide: "Warum" - und "Warum nicht" -Fragen können hier im Allgemeinen nicht beantwortet werden. Da die meisten Prinzipien der Python-Entwicklung hier keine Fragen beantworten, erhalten Sie selten (wenn überhaupt) eine Antwort auf eine "Warum" - oder "Warum nicht" -Frage. Außerdem haben Sie kein Problem zu lösen. Du hörst dich an, als hättest du einen Scherz. Wenn Sie ein Problem haben ("Wie kann ich das fehlende Vorzeichen in diesem Beispiel umgehen ..."), ist dies sinnvoll. "Warum nicht" ist für diesen Veranstaltungsort nicht sinnvoll.
S.Lott
31
Die Frage mag ein wenig emotional sein, aber ich denke nicht, dass es eine schlechte Frage ist. Ich bin sicher, dass viele Leute nach einer eingebauten Zeichenfunktion gesucht haben, daher kann es merkwürdig sein, warum es keine gibt.
FogleBird
17
Dies ist eine absolut objektive Frage: „Warum“ Python fehlt eine bestimmte Funktion? Dies ist eine legitime Frage zur Geschichte des Sprachdesigns, die beantwortet werden kann, indem auf die entsprechende Diskussion von Python-Dev oder anderen Foren (manchmal Blog-Posts) verwiesen wird, in denen Python verwendet wird Kernentwickler haben zufällig ein Thema herausgearbeitet. Nachdem ich zuvor selbst versucht habe, in Python-dev nach Teilen der Geschichte zu suchen, kann ich verstehen, warum ein Neuling in der Sprache in eine Sackgasse geraten könnte, und hier in der Hoffnung einer erfahreneren Python-Person nachfragen!
Brandon Rhodes

Antworten:

227

BEARBEITEN:

In der Tat gab es einen Patch, der sign()in Mathe enthalten war , aber er wurde nicht akzeptiert, weil sie sich nicht einig waren, was er in allen Randfällen zurückgeben sollte (+/- 0, +/- nan usw.) zurückgegeben werden sollte.

Daher haben sie beschlossen, nur Copysign zu implementieren, das (obwohl ausführlicher) verwendet werden kann, um das gewünschte Verhalten für Edge-Fälle an den Endbenutzer zu delegieren - was manchmal den Aufruf von erforderlich machtcmp(x,0) .


Ich weiß nicht, warum es nicht eingebaut ist, aber ich habe einige Gedanken.

copysign(x,y):
Return x with the sign of y.

Am wichtigsten copysignist, eine Obermenge von sign! Das Aufrufen copysignmit x = 1 entspricht einer signFunktion. Sie können es also einfach verwenden copysignund vergessen .

>>> math.copysign(1, -4)
-1.0
>>> math.copysign(1, 3)
1.0

Wenn Sie es satt haben, zwei ganze Argumente zu übergeben, können Sie dies auf signdiese Weise implementieren , und es ist weiterhin mit den von anderen erwähnten IEEE-Inhalten kompatibel:

>>> sign = functools.partial(math.copysign, 1) # either of these
>>> sign = lambda x: math.copysign(1, x) # two will work
>>> sign(-4)
-1.0
>>> sign(3)
1.0
>>> sign(0)
1.0
>>> sign(-0.0)
-1.0
>>> sign(float('nan'))
-1.0

Zweitens, normalerweise, wenn Sie das Zeichen von etwas wollen, multiplizieren Sie es einfach mit einem anderen Wert. Und natürlich ist das im Grunde wascopysign macht natürlich.

Also statt:

s = sign(a)
b = b * s

Sie können einfach tun:

b = copysign(b, a)

Und ja, ich bin überrascht, dass Sie Python seit 7 Jahren verwenden und denken, cmpdass es so einfach entfernt und ersetzt werden kann sign! Haben Sie noch nie eine Klasse mit einer __cmp__Methode implementiert ? Hast du noch nie angerufen?cmp eine benutzerdefinierte Komparatorfunktion und angegeben?

Zusammenfassend wollte ich auch eine signFunktion, aber copysignmit dem ersten Argument 1 wird es gut funktionieren. Ich bin nicht der Meinung, dass signdies nützlicher wäre als copysign, da ich gezeigt habe, dass es sich lediglich um eine Teilmenge derselben Funktionalität handelt.

FogleBird
quelle
35
Mit [int(copysign(1, zero)) for zero in (0, 0.0, -0.0)]gibt gibt [1, 1, -1]. Das sollte [0, 0, 0]laut en.wikipedia.org/wiki/Sign_function
user238424
12
@Andrew - @ user238424s Anrufreihenfolge ist korrekt. copysign(a,b)gibt a mit dem Vorzeichen von b zurück - b ist die variierende Eingabe, a ist der Wert, auf den mit dem Vorzeichen von b normalisiert werden soll. In diesem Fall zeigt der Kommentator, dass das Copysign (1, x) als Ersatz für das Zeichen (x) fehlschlägt, da es 1 für x = 0 zurückgibt, während das Zeichen (0) 0
ergibt
7
Floats halten "Zeichen" getrennt von "Wert"; -0.0 ist eine negative Zahl, auch wenn dies ein Implementierungsfehler zu sein scheint. Die einfache Verwendung cmp()führt zu den gewünschten Ergebnissen, wahrscheinlich für fast jeden Fall, den jemand interessieren würde: [cmp(zero, 0) for zero in (0, 0.0, -0.0, -4, 5)]==> [0, 0, 0, -1, 1].
Pythonlarry
11
s = sign(a) b = b * sist nicht gleichbedeutend mit b = copysign(b, a)! Das Vorzeichen von b wird nicht berücksichtigt. ZB wenn a=b=-1der erste Code 1 zurückgibt, während der zweite -1 zurückgibt
Johannes Jendersie
14
In Anbetracht der Definition des Ersatzes für falsches Zeichen (), des falschen Äquivalents für die Multiplikation mit dem Zeichen (a), der falschen Erklärung für die Motivation des Copysigns und der korrekten Ersetzung "cmp (x, 0)", die bereits in der Frage erwähnt wurde - gibt es nicht viele Infos und es ist mir unklar, warum dies die "akzeptierte" Antwort mit so vielen Stimmen ist.
kxr
59

"Copysign" ist in IEEE 754 definiert und Teil der C99-Spezifikation. Deshalb ist es in Python. Die Funktion kann nicht vollständig durch abs (x) * -Zeichen (y) implementiert werden, da sie mit NaN-Werten umgehen soll.

>>> import math
>>> math.copysign(1, float("nan"))
1.0
>>> math.copysign(1, float("-nan"))
-1.0
>>> math.copysign(float("nan"), 1)
nan
>>> math.copysign(float("nan"), -1)
nan
>>> float("nan") * -1
nan
>>> float("nan") * 1
nan
>>> 

Das macht copysign () zu einer nützlicheren Funktion als sign ().

Was bestimmte Gründe angeht, warum das IEEE-Signbit (x) in Standard-Python nicht verfügbar ist, weiß ich nicht. Ich kann Annahmen treffen, aber es wäre eine Vermutung.

Das Mathematikmodul selbst verwendet Copysign (1, x), um zu überprüfen, ob x negativ oder nicht negativ ist. In den meisten Fällen handelt es sich um mathematische Funktionen, die nützlicher erscheinen als ein Vorzeichen (x), das 1, 0 oder -1 zurückgibt, da ein Fall weniger zu berücksichtigen ist. Das Folgende stammt beispielsweise aus Pythons Mathematikmodul:

static double
m_atan2(double y, double x)
{
        if (Py_IS_NAN(x) || Py_IS_NAN(y))
                return Py_NAN;
        if (Py_IS_INFINITY(y)) {
                if (Py_IS_INFINITY(x)) {
                        if (copysign(1., x) == 1.)
                                /* atan2(+-inf, +inf) == +-pi/4 */
                                return copysign(0.25*Py_MATH_PI, y);
                        else
                                /* atan2(+-inf, -inf) == +-pi*3/4 */
                                return copysign(0.75*Py_MATH_PI, y);
                }
                /* atan2(+-inf, x) == +-pi/2 for finite x */
                return copysign(0.5*Py_MATH_PI, y);

Dort können Sie deutlich sehen, dass copysign () eine effektivere Funktion ist als eine dreiwertige sign () -Funktion.

Sie schrieben:

Wenn ich ein Python-Designer wäre, wäre ich umgekehrt: kein eingebautes cmp (), sondern ein Zeichen ()

Das heißt, Sie wissen nicht, dass cmp () nicht nur für Zahlen verwendet wird. cmp ("This", "That") kann nicht mit einer sign () - Funktion implementiert werden.

Bearbeiten, um meine zusätzlichen Antworten an anderer Stelle zusammenzustellen :

Sie begründen Ihre Rechtfertigung damit, wie oft abs () und sign () zusammen gesehen werden. Da die C-Standardbibliothek keinerlei 'sign (x)' - Funktion enthält, weiß ich nicht, wie Sie Ihre Ansichten begründen. Es gibt eine abs (int) und fabs (double) und fabsf (float) und fabsl (long), aber keine Erwähnung des Zeichens. Es gibt "copysign ()" und "signbit ()", diese gelten jedoch nur für IEEE 754-Nummern.

Was würde bei komplexen Zahlen das Zeichen (-3 + 4j) in Python zurückgeben, sollte es implementiert werden? abs (-3 + 4j) gibt 5,0 zurück. Dies ist ein klares Beispiel dafür, wie abs () an Stellen verwendet werden kann, an denen sign () keinen Sinn ergibt.

Angenommen, Zeichen (x) wurden Python als Ergänzung zu abs (x) hinzugefügt. Wenn 'x' eine Instanz einer benutzerdefinierten Klasse ist, die die Methode __abs __ (self) implementiert, ruft abs (x) x .__ abs __ () auf. Um korrekt zu arbeiten und abs (x) auf die gleiche Weise zu behandeln, muss Python einen Vorzeichen (x) -Slot erhalten.

Dies ist für eine relativ unnötige Funktion übermäßig. Außerdem, warum sollte das Zeichen (x) existieren und das nichtnegative (x) und das nichtpositive (x) nicht existieren? Mein Ausschnitt aus der Implementierung des Python-Mathematikmoduls zeigt, wie Copybit (x, y) verwendet werden kann, um nonnegative () zu implementieren, was ein einfaches Zeichen (x) nicht kann.

Python sollte eine bessere Unterstützung für die mathematische Funktion IEEE 754 / C99 bieten. Das würde eine Signbit (x) -Funktion hinzufügen, die im Fall von Floats tun würde, was Sie wollen. Es würde nicht für ganze Zahlen oder komplexe Zahlen funktionieren, geschweige denn für Zeichenfolgen, und es würde nicht den Namen haben, den Sie suchen.

Sie fragen "warum" und die Antwort lautet "Zeichen (x) ist nicht nützlich". Sie behaupten, dass es nützlich ist. Ihre Kommentare zeigen jedoch, dass Sie nicht genug wissen, um diese Behauptung aufstellen zu können, was bedeutet, dass Sie überzeugende Beweise für ihre Notwendigkeit vorlegen müssten. Zu sagen, dass NumPy es implementiert, ist nicht überzeugend genug. Sie müssten Fälle zeigen, wie vorhandener Code mit einer Zeichenfunktion verbessert wird.

Und das außerhalb des Bereichs von StackOverflow. Nehmen Sie es stattdessen zu einer der Python-Listen.

Andrew Dalke
quelle
5
Nun, ich weiß nicht, ob dich das glücklich macht, aber Python 3 hat weder cmp()noch sign():-)
Antoine P.
4
Das Schreiben einer guten sign () - Funktion, die mit IEEE 754 ordnungsgemäß funktioniert, ist nicht trivial. Dies wäre ein guter Punkt, um es in die Sprache aufzunehmen, anstatt es wegzulassen, obwohl ich diesen Punkt in der Frage nicht näher ausgeführt habe
Davide
2
Ihr Kommentar dazu, wie "wenn Sie möchten, dass die Sortierung stabil ist" bedeutet, dass Sie auch nicht wissen, wie eine stabile Sortierung funktioniert. Ihre Aussage, dass Copysign und Sign gleichwertig sind, zeigt, dass Sie vor diesem Beitrag nicht viel über IEEE 754-Mathematik wussten. Sollte Python alle 754 mathematischen Funktionen im Kern implementieren? Was sollte es für Nicht-C99-Compiler tun? Nicht-754-Plattformen? "isnonnegative" und "isnonpositive" sind ebenfalls nützliche Funktionen. Sollte Python auch diese enthalten? abs (x) verschiebt sich zu x .__ abs __ (), sollte also sign (x) auf x .__ sign __ () verschoben werden? Es gibt wenig Nachfrage oder Bedarf dafür. Warum sollte es also im Kern stecken bleiben?
Andrew Dalke
2
math.copysign (1, float ("- nan")) gibt 1.0 statt -1,0 zurück, wenn ich es in 2.7
dansalmo
34

Ein weiterer Liner für Zeichen ()

sign = lambda x: (1, -1)[x<0]

Wenn Sie möchten, dass 0 für x = 0 zurückgegeben wird:

sign = lambda x: x and (1, -1)[x<0]
Dansalmo
quelle
1
Warum? Die Frage selbst erkennt an, dass dies cmp(x, 0)äquivalent signund lambda x: cmp(x, 0)lesbarer ist als das, was Sie vorschlagen.
ToolmakerSteve
1
In der Tat habe ich mich geirrt. Ich hatte angenommen, dass 'cmp' angegeben wurde, um -1,0, + 1 zurückzugeben, aber ich sehe, dass die Spezifikation dies nicht garantiert.
ToolmakerSteve
Wunderschönen. Beantwortet die gestartete Frage: python int oder float auf -1, 0, 1?
scharfmn
1
Gibt es einen Vorteil bei der Verwendung von Listen anstelle von -1 if x < 0 else 1?
Mateen Ulhaq
6
sign = lambda x: -1 if x < 0 else 1ist 15% schneller . Gleiches gilt für sign = lambda x: x and (-1 if x < 0 else 1).
Mateen Ulhaq
26

Da cmpwurde entfernt , können Sie die gleiche Funktionalität mit erhalten

def cmp(a, b):
    return (a > b) - (a < b)

def sign(a):
    return (a > 0) - (a < 0)

Es funktioniert für float, intund sogar Fraction. Im Falle von float, beachten Siesign(float("nan")) Null.

Python erfordert nicht, dass Vergleiche einen Booleschen Wert zurückgeben. Das Erzwingen der Vergleiche mit bool () schützt daher vor zulässigen, aber ungewöhnlichen Implementierungen:

def sign(a):
    return bool(a > 0) - bool(a < 0)
AllenT
quelle
13

Nur korrekte Antwort gemäß Wikipedia-Definition

Die Definition auf Wikipedia lautet:

Zeichen Definition

Daher,

sign = lambda x: -1 if x < 0 else (1 if x > 0 else (0 if x == 0 else NaN))

Was in jeder Hinsicht vereinfacht werden kann, um:

sign = lambda x: -1 if x < 0 else (1 if x > 0 else 0)

Diese Funktionsdefinition wird schnell ausgeführt und liefert garantiert korrekte Ergebnisse für 0, 0,0, -0,0, -4 und 5 (siehe Kommentare zu anderen falschen Antworten).

Beachten Sie, dass Null (0) weder positiv noch negativ ist .

Serge Stroobandt
quelle
1
Diese Antwort zeigt, wie prägnant und doch mächtig Python sein kann.
NelsonGon
1
Quibble: Der Code implementiert die WP-Definition nicht, sondern ersetzt die mittlere Klausel am Ende durch eine Standardklausel. Während dies notwendig ist, um nicht reelle Zahlen wie nan zu behandeln, wird fälschlicherweise gezeigt, dass es direkt der WP-Anweisung folgt ('Daher').
Jürgen Strobel
1
@ JürgenStrobel Ich weiß genau, was du meinst und ich habe auch lange über dieses Problem nachgedacht. Ich habe die Antwort jetzt für den korrekten Formalismus erweitert und gleichzeitig die vereinfachte Version für die meisten Anwendungsfälle beibehalten.
Serge Stroobandt
10

numpy hat eine Vorzeichenfunktion und bietet Ihnen auch einen Bonus für andere Funktionen. So:

import numpy as np
x = np.sign(y)

Achten Sie nur darauf, dass das Ergebnis numpy.float64 ist:

>>> type(np.sign(1.0))
<type 'numpy.float64'>

Für Dinge wie json ist dies wichtig, da json nicht weiß, wie numpy.float64-Typen serialisiert werden. In diesem Fall könnten Sie Folgendes tun:

float(np.sign(y))

einen regelmäßigen Schwimmer zu bekommen.

Luca
quelle
10

Versuchen Sie dies auszuführen, wobei x eine beliebige Zahl ist

int_sign = bool(x > 0) - bool(x < 0)

Der Zwang zu bool () behandelt die Möglichkeit, dass der Vergleichsoperator keinen Booleschen Wert zurückgibt.

Eric Song
quelle
Gute Idee, aber ich denke du meinst: int_sign = int (x> 0) - int (x <0)
yucer
Ich meine: int_sign = lambda x: (x> 0) - (x <0)
yucer
1
@yucer nein, er meinte wirklich die Besetzung zu bool (was sowieso eine Unterklasse von int ist), wegen der theoretischen Möglichkeit, von der er den Link zur Erklärung gab.
Walter Tross
Der einzige Nachteil dieses Konstrukts ist, dass das Argument zweimal erscheint, was nur in Ordnung ist, wenn es sich um eine einzelne Variable handelt
Walter Tross
5

Ja, eine korrekte sign()Funktion sollte zumindest im Mathematikmodul vorhanden sein - da es sich um eine Zahl handelt. Weil man es häufig für mathematisch orientierten Code benötigt.

Ist math.copysign()aber auch unabhängig nützlich.

cmp()und obj.__cmp__()... haben in der Regel unabhängig eine hohe Bedeutung. Nicht nur für mathematisch orientierten Code. Betrachten Sie das Vergleichen / Sortieren von Tupeln, Datumsobjekten, ...

Die Entwicklerargumente unter http://bugs.python.org/issue1640 bezüglich des Auslassens von math.sign()sind seltsam, weil:

  • Es gibt keine separate -NaN
  • sign(nan) == nan ohne Sorge (wie exp(nan))
  • sign(-0.0) == sign(0.0) == 0 ohne Sorge
  • sign(-inf) == -1 ohne Sorge

- wie es in numpy ist

kxr
quelle
4

Gibt in Python 2 cmp()eine Ganzzahl zurück: Es ist nicht erforderlich, dass das Ergebnis -1, 0 oder 1 ist, daher sign(x)ist es nicht dasselbe wiecmp(x,0) .

In Python 3 wurde cmp()zugunsten eines reichhaltigen Vergleichs entfernt. Für cmp()Python 3 schlägt dies vor :

def cmp(a, b):
    return (a > b) - (a < b)

Dies ist in Ordnung für cmp (), kann jedoch nicht für sign () verwendet werden, da die Vergleichsoperatoren keine Booleschen Werte zurückgeben müssen .

Um mit dieser Möglichkeit umzugehen, müssen die Vergleichsergebnisse zu Booleschen Werten gezwungen werden:

 def sign(a):
    return bool(x > 0) - bool(x < 0)

Dies funktioniert für alle, typedie vollständig geordnet sind (einschließlich spezieller Werte wie NaNoder Unendlichkeiten).

AllenT
quelle
0

Sie brauchen keine, Sie können nur verwenden:

If not number == 0:
    sig = number/abs(number)
else:
    sig = 0
Inetphantom
quelle
4
Es ist darauf hinzuweisen, dass es x / abs(x)etwas länger dauert, als nur zu verketten if/else, um zu überprüfen, auf welcher Seite von 0 sich die Variable befindet, oder ob Sie schleimig und dennoch zufriedenstellend sind, return (x > 0) - (x < 0)um boolWerte zu subtrahieren und einenint
1
Python behandelt Trueund Falsewie 1und 0Sie können absolut dies tun und entweder bekommen 1, 0oder -1. def sign(x): return (x > 0) - (x < 0)wird kein zurückgeben bool, es wird ein zurückgeben int- wenn Sie bestehen, erhalten 0Sie 0zurück
0

Das tut es einfach nicht.

Der beste Weg, dies zu beheben, ist:

sign = lambda x: bool(x > 0) - bool(x < 0)
Michel de Ruiter
quelle
-8

Der Grund, warum "Zeichen" nicht enthalten ist, ist, dass es nicht mehr einfach und praktisch wäre, mit Python zu arbeiten, wenn wir jeden nützlichen Einzeiler in die Liste der integrierten Funktionen aufnehmen würden. Wenn Sie diese Funktion so oft verwenden, warum nehmen Sie sie dann nicht selbst heraus? Es ist nicht so, als wäre es aus der Ferne schwierig oder sogar langweilig, dies zu tun.

Antoine P.
quelle
6
Nun, ich würde das nur kaufen, wenn abs()es auch weggelassen würde. sign()und abs()werden oft zusammen verwendet, sign()ist die nützlichste der beiden (IMO), und keine ist aus der Ferne schwer oder mühsam zu implementieren (obwohl sie fehleranfällig ist, sehen Sie, wie diese Antwort falsch ist: stackoverflow.com/questions/1986152/… )
Davide
1
Die Sache ist, dass das numerische Ergebnis von sich sign()selbst selten nützlich ist. Meistens verwenden Sie unterschiedliche Codepfade, je nachdem, ob eine Variable positiv oder negativ ist. In diesem Fall ist es besser lesbar, die Bedingung explizit zu schreiben.
Antoine P.
3
abs () wird viel häufiger verwendet als ein Zeichen (). Und ich habe Sie auf den NumPy-Tracker hingewiesen, der zeigt, wie schwierig es sein kann, sign () zu implementieren. Was soll das Zeichen (-3 + 4j) sein? Während abs (-3 + 4j) 5,0 ist. Sie machen Aussagen, dass sign () und abs () oft zusammen gesehen werden. Die C-Standardbibliothek verfügt nicht über eine Vorzeichenfunktion. Woher beziehen Sie Ihre Daten?
Andrew Dalke