Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使np.vectorize在标量输入上返回标量值_Python_Numpy_Numpy Ufunc - Fatal编程技术网

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