2016-02-14 78 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