2013-02-11 78 views
3

我可以得到一個numpy向量化函數來使用緩衝區對象作爲結果,而不是創建一個由該對象返回的新數組嗎?矢量化numpy函數可以使用緩衝區作爲輸出嗎?

我想要做這樣的事情:

fun = numpy.vectorize(lambda x: x + 1) 
a = numpy.zeros((1, 10) 
buf = numpy.zeros((1, 10) 
fun(a, buf_obj = buf) 

,而不是

fun = numpy.vectorize(lambda x: x + 1) 
a = numpy.zeros((1, 10) 
buf = fun(a) 

回答

3

不爲vectorize,但大多數numpy的功能,採取out說法,你想要做什麼。

你想用什麼功能numpy.vectorize?當您嘗試「矢量化」計算時,幾乎總是會出現錯誤的解決方案。

在你上面的例子,如果你想要做就地操作,你可以用完成它:

a = numpy.zeros((1, 10)) 
a += 1 

或者,如果你想成爲一個有點冗長,但到底該怎麼做你的榜樣會這樣做:

a = numpy.zeros((1, 10)) 
buf = numpy.empty_like(a) 
numpy.add(a, 1, out=buf) 

numpy.vectorize必須爲數組中的每個元素調用python函數。因此,與在整個陣列上運行的numpy函數相比,它有額外的開銷。通常,當人們提到「矢量化」一個表達式以獲得加速時,他們指的是從基本numpy函數的構建塊中構建表達式,而不是使用vectorize(這當然令人困惑......)。


編輯:基於您的評論,vectorize確實適合你的使用情況! (寫一個「光柵計算器」是一個非常完美的用例,除了安全/沙盒問題。)

另一方面,numexpr可能更適合,如果你不介意附加的依賴。

速度更快,需要參數out

+0

我有一個應用跨2D矩陣數組的用戶定義函數的api。矩陣可能比內存大,未對齊,甚至可能代表不同的單元大小(這是GIS問題)。在插入並對齊所有數據後,我允許用戶傳入一個函數,該函數將在任意像素堆棧上運行。有沒有更好的機制讓用戶操作這樣的數據? – Rich 2013-02-12 00:43:40

+1

那麼,在這種情況下,'vectorize'可能就是你想要的!另一方面,你可能會考慮'numexpr'。首先,它通常要快得多,其次,它需要一個'out'參數。 – 2013-02-12 00:50:17