2016-04-03 45 views
0

當我嘗試向量化以下bump函數時,我注意到一些奇怪的行爲。它應該在開區間(-1,1)的任何輸入返回正值,以及用於輸入返回0別處:Python - 擴展numpy數組更改向量化函數的所有值

>>import numpy as np 

>>def bump(x): 
    if np.abs(x)<1: 
     return np.exp(-1/(1-x**2)) 
    else: 
     return 0 

>>vbump=np.vectorize(bump) 

當我然後嘗試包含在僅值陣列上評價函數vbump (-1,1),它的行爲與預期:

>>x=np.linspace(-0.99,0.99,10) 
>>vbump(x) 

array([ 1.50022600e-22, 8.57431637e-02, 2.38427081e-01, 
    3.25559999e-01, 3.63401061e-01, 3.63401061e-01, 
    3.25559999e-01, 2.38427081e-01, 8.57431637e-02, 
    1.50022600e-22]) 

在另一方面,當我嘗試對其進行評估其中包含的(1,1)以外的值數組我得到的所有零上,即使是值應該是正數:

>>x2=np.linspace(-1.1,1.1,10) 
>>vbump(x2) 

array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) 

它爲什麼會這樣?我對python和numpy相當陌生,但是從我的理解來看,當我向一個函數進行矢量化時,它應該允許函數以元素方式在列表上進行線程化。爲什麼要將更大的數組影響其他地方的元素智能評估?

我要補充一點,我已經找到了解決方案,以評估在一個陣列碰撞功能的直接問題,使用

>>np.piecewise(x, [x <=-1, x >= 1,(-1<x)&(x<1)], [0,0,lambda t:np.exp(-1/(1-t**2))]) 

,但我還是想了解正在發生的事情與我最初的方法。

+0

的重複https://stackoverflow.com/questions/26316357/ numpy的,矢量化 - 回報 - 不正確值 –

回答

2

作爲文檔np.vectorize說明:

vectorized的輸出的數據類型是通過調用與所述輸入的第一個元素的函數來確定。這可以通過指定otypes參數來避免。

當第一個值是-1.1,你的函數的返回值是一個整數0,所以D型成了一個整數D型(具體取決於您的設置,跟我它的INT32):

>>> vbump(np.array([-0.99])) 
array([ 1.50022600e-22]) 
>>> vbump(np.array([-0.99])).dtype 
dtype('float64') 
>>> vbump(np.array([-1.0])) 
array([0]) 
>>> vbump(np.array([-1.0])).dtype 
dtype('int32') 

要麼改變你的00.0(所以你總是返回一個浮點數),或者指定otypes

>>> vbump = np.vectorize(bump, otypes=[float]) 
>>> vbump(np.linspace(-1.1, 1.1, 10)) 
array([ 0.  , 0.02396887, 0.20269374, 0.31495442, 0.36234271, 
     0.36234271, 0.31495442, 0.20269374, 0.02396887, 0.  ])