2013-02-20 71 views
5

一個裝飾我試圖向量化(同意,不是最有效的方式做到這一點,但我的問題是,而在裝飾用)以下功能NumPy的矢量化與參數

@np.vectorize 
def diff_if_bigger(x, y): 
    return y - x if y > x else 0 

x = np.array([5.6, 7.0]) 
y = 8 

diff_if_bigger(x, y) 
# outputs array([2, 1]) which is not what I want 

編輯:重新啓動IPython後,輸出結果爲OK。

任何人都可以解釋爲什麼diff_if_bigger結果得到了tansformed成np.int數組即使第一個參數x是這裏的np.float的阿雷,反而對什麼是在doc ????

現在,我想強制浮置輸出,所以我做了這個

@np.vectorize('np.float') 
def diff_if_bigger(x, y): 
    return y - x if y > x else 0 
# Error !! 
# TypeError: Object is not callable. 

@np.vectorize(otypes='np.float') 
def diff_if_bigger(x, y): 
    return y - x if y > x else 0 
# Again error !! 
# TypeError: __init__() takes at least 2 arguments (2 given) 


@np.vectorize(otypes=[np.float]) 
def diff_if_bigger(x, y): 
    return y - x if y > x else 0 
# Still an error !! 
# TypeError: __init__() takes at least 2 arguments (2 given) 

順便說一句,即使這

vec_diff = np.vectorize(diff_if_bigger, otypes=[np.float]) 

不起作用!發生什麼了??

編輯:事實上,後者工作後,我重新啓動IPython。

所以我前兩次的修改之後,我的問題是,現在兩個方面:

1 - 我如何使用np.vectorize作爲帶有參數的裝飾?

2-如何清理IPython狀態?

+0

@seberg,不,你說廢話.. – 2013-02-20 19:57:44

+0

看,你真的沒有回答具體的任何我的問題..你甚至試圖運行我發佈的代碼位?你看過矢量化幫助嗎? – 2013-02-21 02:07:07

+0

對不起,但也許你應該給出更好的錯誤描述,這樣診斷有點困難。 1.你所有的例子實際上都有效(但裝飾者給出的類型不能)。你的第一個例子可能會失敗,如果你在輸入之前給了不同的輸入。 3.對已經被矢量化的函數的最後一個vectorize調用是沒有意義的,所以也許這是你不祥的「不起作用」。 – seberg 2013-02-21 02:51:26

回答

7

工作對我來說:

>>> import numpy as np 
>>> @np.vectorize 
... def diff_if_bigger(x, y): 
...  return y - x if y > x else 0 
... 
>>> diff_if_bigger(np.array([5.6,7.0]), 8) 
array([ 2.4, 1. ]) 

注意np.vectorize是不是真的意味着作爲除了最簡單的情況下,一個裝飾。如果您需要指定明確的otype,請使用常用的表格new_func = np.vectorize(old_func, otypes=...)或使用functools.partial獲取裝飾器。

還要注意,np.vectorize,默認情況下,從第一個參數評價函數獲得它的輸出類型:

vectorized輸出的數據類型是通過調用函數的第一個元素來確定輸入。

所以,你應該通過float並返回float如果你想確保它推斷float作爲輸出D型(例如使用else 0.0並通過y = 8.0)。

+0

我的numpy版本是1.6.1 ..並且我沒有得到與你報告相同的行爲,但是在我的帖子中提到了這個行爲。在我的cas中,第一個輸入x是一個'np.float'的數組,所以爲什麼我在最後得到一個'np.int'數組?但更糟糕的是,正如我在OP中所提到的,即使我沒有使用np.vectorize作爲裝飾器,我也會遇到錯誤! – 2013-02-20 20:01:19

+1

它不是第一個重要的「輸入」,但第一個「輸出」和0不是浮點數。 – seberg 2013-02-21 02:54:28

+0

@nneonneo恐怕我得到的行爲是因爲我的IPython會話的內部狀態。但後來,我無法弄清楚爲什麼會話被破壞到np.vectorize的行爲不像文檔中所宣稱的那樣。 – 2013-02-21 22:08:10