Numpy无法对函数进行向量化

ztyzrc3y  于 2023-04-21  发布在  其他
关注(0)|答案(2)|浏览(163)

我想将这个简单的函数应用于numpy数组***fast***:

def f (x):
    return max(0,1-abs(x))

为了清楚起见,下面是情节:

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(start=-4,stop=4, num=100)
plt.plot(x, list(map(f,x)))

但是,np.vectorize(f)(x)返回向量0
是的,我知道
提供vectorize函数主要是为了方便,而不是为了性能。其实现本质上是一个for循环。
但它至少应该返回一个正确的值不是吗
PS.我设法用手矢量化f

def f (x):
    z = np.zeros(x.shape)
    return np.fmax(z,1-np.abs(x), out=z)
ygya80vv

ygya80vv1#

这是因为np.vectorize将返回类型推断为整数dtype。请注意文档中的这一部分:
vectorized输出的数据类型是通过调用输入的第一个元素来确定的。这可以通过指定otypes参数来避免。
在本例中,max(0, 1 - abs(-4.))的输出是int对象0。您可以更改函数以使用float,或者显式指定outypes参数:

np.vectorize(f, otypes=[np.float64])(x)
9o685dep

9o685dep2#

max函数的返回类型为int,因为您使用了0而不是0.0。使用

def f(x):
    return max(0.0,1.0-abs(x))

会给予正确的答案

相关问题