我试图在numpy中对一个简单函数进行矢量化,得到不一致的行为。我希望我的代码为值返回0<0.5,否则取不变值。奇怪的是,从命令行运行不同的脚本会产生不同的结果:有时它工作正常,有时我得到所有0。当d<=T它似乎与返回的第一个值是否为0有关。有什么想法吗?谢谢
import numpy as np def my_func(d, T=0.5): if d > T: return d #if d <= T: return 0 else: return 0 #return 0 N = 4 A = np.random.uniform(size=N**2) A.shape = (N,N) print A f = np.vectorize(my_func) print f(A) $ python x.py [[ 0.86913815 0.96833127 0.54539153 0.46184594] [ 0.46550903 0.24645558 0.26988519 0.0959257 ] [ 0.73356391 0.69363161 0.57222389 0.98214089] [ 0.15789303 0.06803493 0.01601389 0.04735725]] [[ 0.86913815 0.96833127 0.54539153 0. ] [ 0. 0. 0. 0. ] [ 0.73356391 0.69363161 0.57222389 0.98214089] [ 0. 0. 0. 0. ]] $ python x.py [[ 0.37127366 0.77935622 0.74392301 0.92626644] [ 0.61639086 0.32584431 0.12345342 0.17392298] [ 0.03679475 0.00536863 0.60936931 0.12761859] [ 0.49091897 0.21261635 0.37063752 0.23578082]] [[0 0 0 0] [0 0 0 0] [0 0 0 0] [0 0 0 0]]
如果这确实是您想要解决的问题,那么有一个更好的解决方案:
A[A<=0.5] = 0.0
但是,代码的问题是,如果条件通过,则返回 整数 0,不是 浮动
的输出的数据类型 vectorized 通过使用输入的第一个元素调用函数来确定。可以通过指定 otypes
vectorized
otypes
所以当第一个入口 <0.5 ,它尝试创建一个整数数组,而不是浮点数组。 你应该改变 return 0 到
<0.5
return 0
return 0.0
my_func ,您可以使用
my_func
f = np.vectorize(my_func, otypes=[np.float])