Np.vectorize Rückkehr Skalar Wert auf Skalar Eingang

Der folgende Code gibt ein Array anstelle des erwarteten Floatwertes zurück.

def f(x): return x+1 f = np.vectorize(f, otypes=[np.float]) >>> f(10.5) array(11.5) 

Gibt es eine Möglichkeit, es zu erzwingen, geben Sie einfach Skalar Wert, wenn die Eingabe ist skalar und nicht die seltsame Array-Typ?

Ich finde es seltsam es tut es nicht standardmäßig, da alle anderen ufuncs wie np.cos, np.sin usw. regelmäßige Skalare zurückgeben

Bearbeiten : Dies ist der Code, der funktioniert:

 import numpy as np import functools def as_scalar_if_possible(func): @functools.wraps(func) #this is here just to preserve signature def wrapper(*args, **kwargs): return func(*args, **kwargs)[()] return wrapper @as_scalar_if_possible @np.vectorize def f(x): return x + 1 

Drucken (f (11.5)) # druckt 12.5

    One Solution collect form web for “Np.vectorize Rückkehr Skalar Wert auf Skalar Eingang”

    Das Ergebnis ist technisch ein Skalar, da seine Form () . Zum Beispiel ist np.array(11.5)[0] kein gültiger Vorgang und führt zu einer Ausnahme. In der Tat werden die zurückgegebenen Ergebnisse in den meisten Fällen als Skalar fungieren.

    z.B.

     x = np.array(11.5) print(x + 1) # prints 12.5 print(x < 12) # prints True, rather than [ True] x[0] # raises IndexError 

    Wenn du einen "richtigen" Skalarwert bekommst, kannst du die vektorisierte Funktion einfach umschließen, um die Form des zurückgegebenen Arrays zu überprüfen. Das ist, was numpy ufuncs hinter den Kulissen zu tun.

    z.B.

     import numpy as np def as_scalar_if_possible(func): def wrapper(arr): arr = func(arr) return arr if arr.shape else np.asscalar(arr) return wrapper @as_scalar_if_possible @np.vectorize def f(x): return x + 1 print(f(11.5)) # prints 12.5 
    Python ist die beste Programmiersprache der Welt.