矢量化是不确定的

tel*_*t99 1 python numpy

我试图在numpy中呈现一个简单的函数并获得不一致的行为.我希望我的代码在值<0.5时返回0,否则返回未更改的值.奇怪的是,命令行中不同的脚本运行会产生不同的结果:有时它可以正常工作,有时我会得到全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]]
Run Code Online (Sandbox Code Playgroud)

And*_*ffe 7

如果这确实是您想要解决的问题,那么有一个更好的解决方案:

A[A<=0.5] = 0.0
Run Code Online (Sandbox Code Playgroud)

但是,代码的问题在于,如果条件通过,则返回整数 0,而不是float 0.0.从文档:

输出的数据类型vectorized是通过使用输入的第一个元素调用函数来确定的.通过指定otypes参数可以避免这种情况.

因此,当第一个条目是<0.5,它会尝试创建一个整数,而不是浮点数组.你应该return 0改为

return 0.0
Run Code Online (Sandbox Code Playgroud)

或者,如果您不想触摸my_func,可以使用

f = np.vectorize(my_func, otypes=[np.float])
Run Code Online (Sandbox Code Playgroud)