在numpy中使用vectorize时,np数组中的连续零后丢失十进制值

2jcobegt  于 2023-10-19  发布在  其他
关注(0)|答案(2)|浏览(116)

尝试使用numpy的vectorize来向量化我自定义的ReLU函数。不知何故,我的numpy数组中的一个值为0.5的元素在通过ReLU函数(例如,max函数)

def relu_activation(x):
    return max(0,x)
relu = np.vectorize(relu_activation)

z = np.array([0,0,0.5,1])
z = relu(z)
print(z)

print(z)输出[0 0 0 1],而不是预期的[0 0 0.5 1]
当我用for循环替换我的向量化函数时,它按预期工作。

pbossiut

pbossiut1#

正如@jared评论的那样,最好直接定义向量化函数,例如。

def relu(x):
    return np.maximum(x, 0)
egdjgwm8

egdjgwm82#

在没有真正阅读文档的情况下使用np.vectorize是危险的。在这种情况下,您忽略了有关它如何确定输出dtype的位。默认情况下,它进行试算,并使用结果来确定dtype。对于[0,0,.5,1],第一项的结果是0,一个整数。所以所有的项都是int。如果你想要一个float结果,确保第一个返回是一个float,或者使用otypes参数显式地设置它。
vectorize不是速度工具。对于一个参数,而且是1d参数,列表理解更简单,也同样好。

In [154]: def relu_activation(x):
     ...:     return max(0,x)
     ...: relu = np.vectorize(relu_activation)
     ...: 
     ...: z = np.array([0,0,0.5,1])
     ...: z = relu(z)

注意这个结果的dtype- integer:

In [155]: z
Out[155]: array([0, 0, 0, 1])

给予一个浮点数作为第一个值-并获得浮点数结果:

In [156]: relu([.5,0,0,1,.25])
Out[156]: array([0.5 , 0.  , 0.  , 1.  , 0.25])

指定类型:

In [157]: relu = np.vectorize(relu_activation, otypes=[float])    
In [158]: relu([0,0,.5,1])
Out[158]: array([0. , 0. , 0.5, 1. ])

或者让事情更像列表,对象dtype:

In [159]: relu = np.vectorize(relu_activation, otypes=[object])    
In [160]: relu([0,0,.5,1])
Out[160]: array([0, 0, 0.5, 1], dtype=object)

或者调整函数,使其始终返回浮点数

In [161]: def relu_activation(x):
     ...:     return max(0.0,x)
     ...: relu = np.vectorize(relu_activation)
     ...: 
     ...: z = np.array([0,0,0.5,1])
     ...: z = relu(z)
In [162]: z
Out[162]: array([0. , 0. , 0.5, 1. ])

对于像这样简单的函数,不需要vectorize。虽然它有它的用途,但对于初学者来说使用它太容易了,因为他们不知道足够的numpy。如果你一定要理解,不要害怕坚持使用列表理解。

相关问题