Wie der Titel sagt, nehme ich an, dass ich eine Zeichenfunktion schreiben will (vergessen wir Zeichen (0)), offensichtlich erwarten wir sign (2) = 1 und sign (array ([- 2, -2,2])) = array ([- 1, -1,1]). Die folgende Funktion funktioniert jedoch nicht, da sie keine numpigen Arrays verarbeiten kann.Eine Python-Funktion, die als Argument entweder ein skalares oder ein numpy Array akzeptiert
Die nächste Funktion wird auch nicht funktionieren, da x kein Formelement hat, wenn es nur eine einzelne Zahl ist. Selbst wenn ein Trick wie y = x * 0 + 1 verwendet wird, wird y keine [] -Methode haben.
def sign(x):
y = ones(x.shape)
y[x<0] = -1
return y
Auch mit der Idee von einer anderen Frage (how can I make a numpy function that accepts a numpy array, an iterable, or a scalar?), wird die nächste Funktion nicht, wenn x eine einzelne Zahl ist, weil in diesem Fall x.shape und y.shape sind nur() und die Indizierung y illegal.
def sign(x):
x = asarray(x)
y = ones(x.shape)
y[x<0] = -1
return y
Die einzige Lösung scheint entscheiden, dass der erste zu sein, wenn x ein Array oder eine Zahl ist, aber ich möchte wissen, ob es etwas besser ist. Das Schreiben von verzweigtem Code wäre umständlich, wenn Sie viele kleine Funktionen wie diese haben.
Die Indizierung von 'y' mit einer Maske * ist * legal: Das Problem hier ist, dass' x <0' wiederum ein Skalar ist und kein 0-d Array. Wenn Sie 'y [asarray (x <0)] versuchen, sollte es funktionieren. –
Haben Sie über die Möglichkeit nachgedacht, das eingebaute 'np.sign' zu verwenden? – Jaime
@MarkDickinson Dies ist ein guter, aber es gibt Fehler, wenn x eine einzelne Zahl ist, weil jetzt y auch eine einzelne Zahl sein muss - dann kann y nicht indiziert werden ... – Taozi