2016-02-14 85 views
0

我想np.vectorize AA单期看到使用numpy.vectorize这个lambda函数牙齿功能:NumPy的矢量化行为

saw = lambda x: 0 if x < -2 or x > 2 else x 

但是当我申请的量化saw这个数组:

array([-4. , -3.57894737, -3.15789474, -2.73684211, -2.31578947, 
    -1.89473684, -1.47368421, -1.05263158, -0.63157895, -0.21052632, 
    0.21052632, 0.63157895, 1.05263158, 1.47368421, 1.89473684, 
    2.31578947, 2.73684211, 3.15789474, 3.57894737, 4.  ]) 

我得到:

array([ 0, 0, 0, 0, 0, -1, -1, -1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 
    0, 0, 0]) 

怎么回事请告诉我?

对于考虑我使用Python 2.7使用numpy的1.10.2

+0

请显示您用于生成此代码的所有相关代码。它看起来像你的数据被转换为整数。也许改成'saw = lambda x:0.0 if x < -2 or x > 2 else x'? – SethMMorton

+0

注意:最好使用'np.where'代替'np.vectorize'。 'np.vectorize'真的很慢。 – user2357112

+0

在这种情况下,'where'比'vectorize'快2倍。使用布尔掩码,我可以使它成为3x。 – hpaulj

回答

2

按照np.vectorize文档:

输出类型是通过评估 输入的第一元件确定的,除非它是指定

你的第一输入元件产生int64类型的输出:

In [2]: data = np.array([-4. , -3.57894737, -3.15789474, -2.73684211, -2.31578947, 
    ...: -1.89473684, -1.47368421, -1.05263158, -0.63157895, -0.21052632, 
    ...:  0.21052632, 0.63157895, 1.05263158, 1.47368421, 1.89473684, 
    ...:  2.31578947, 2.73684211, 3.15789474, 3.57894737, 4.  ]) 

In [3]: saw = lambda x: 0 if x < -2 or x > 2 else x 

In [4]: saw_v = np.vectorize(saw) 

In [5]: type(saw_v(data)[0]) 
Out[5]: numpy.int64 

In [6]: type(saw_v(data[5:])[0]) 
Out[6]: numpy.float64 

您必须指定otype而矢量化的功能:

In [9]: saw_v_f = np.vectorize(saw, otypes=[np.float]) 

In [10]: type(saw_v_f(data)[0]) 
Out[10]: numpy.float64 

In [11]: saw_v_f(data) 
Out[11]: 
array([ 0.  , 0.  , 0.  , 0.  , 0.  , 
     -1.89473684, -1.47368421, -1.05263158, -0.63157895, -0.21052632, 
     0.21052632, 0.63157895, 1.05263158, 1.47368421, 1.89473684, 
     0.  , 0.  , 0.  , 0.  , 0.  ]) 
+0

如果x < -2 or x > 2 else x'已经工作,那么会更改为'saw = lambda x:0.0。 – SethMMorton

+0

@SethMMorton,是的,这也有窍门 – soon

+0

像往常一样感谢,@SethMMorton。 –

-1

似乎为我配图的工作。

map(saw, x) 

[0, 0, 0, 0, 0, -1.89473684, -1.47368421, -1.0526315799999999, -0.63157894999999997, -0.21052631999999999, 0.21052631999999999, 0.63157894999999997, 1.0526315799999999, 1.47368421, 1.89473684, 0, 0, 0, 0, 0] 
+0

...但OP使用numpy。这不相关。 – SethMMorton

+1

'np.array(list(map(saw,x)))'和这个样本数组的'vectorize'一样快。 'np.array([看(我)为我在x])'' – hpaulj