Python 使np.vectorize在标量输入上返回标量值
下面的代码返回一个数组,而不是预期的浮点值Python 使np.vectorize在标量输入上返回标量值,python,numpy,numpy-ufunc,Python,Numpy,Numpy Ufunc,下面的代码返回一个数组,而不是预期的浮点值 def f(x): return x+1 f = np.vectorize(f, otypes=[np.float]) >>> f(10.5) array(11.5) 如果输入是标量而不是奇怪的数组类型,有没有办法强制它返回简单的标量值 我觉得很奇怪,因为所有其他的ufunc,比如np.cos、np.sin等,都会返回正则标量,所以默认情况下它不会这样做 编辑: 这是有效的代码: import numpy as np imp
def f(x):
return x+1
f = np.vectorize(f, otypes=[np.float])
>>> f(10.5)
array(11.5)
如果输入是标量而不是奇怪的数组类型,有没有办法强制它返回简单的标量值
我觉得很奇怪,因为所有其他的ufunc,比如np.cos、np.sin等,都会返回正则标量,所以默认情况下它不会这样做
编辑:
这是有效的代码:
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
print(f(11.5))#prints 12.5从技术上讲,结果是一个标量,因为它的形状是
()
。例如,np.array(11.5)[0]
不是有效的操作,将导致异常。实际上,在大多数情况下,返回的结果将充当标量
例如
显然,A[()]也会起作用,没有if。来源:。我选择这个并关闭它,因为显然没有内置的方法来做这件事,只有这个黑客。谢谢从某种意义上说,矢量化本身就是一种黑客行为。它基于
np构建。frompyfunc
返回一个对象数据类型数组。
x = np.array(11.5)
print(x + 1) # prints 12.5
print(x < 12) # prints True, rather than [ True]
x[0] # raises IndexError
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