NumPy基礎(chǔ)-編寫自定義數(shù)組容器

我們可以使用NumPy中引入的NumPy的分配機(jī)制來編寫與NumPy API兼容并提供NumPy功能的自定義實(shí)現(xiàn)的自定義n維數(shù)組容器,應(yīng)用程序包括dask數(shù)組(分布在多個(gè)節(jié)點(diǎn)上的n維數(shù)組)和cupy數(shù)組(GPU上的n維數(shù)組 )。

下面示例的實(shí)用程序不常用,但說明了所涉及的概念。


我們自定義數(shù)組可以像這樣實(shí)例化:


我們可以使用numpy.array或numpy.asarray轉(zhuǎn)換為numpy數(shù)組,這將調(diào)用其_array_方法以獲得標(biāo)準(zhǔn)numpy.ndarray。


如果我們使用numpy函數(shù)對arr進(jìn)行操作,numpy將再次使用array接口將其轉(zhuǎn)換為數(shù)組,然后以通常的方式使用該函數(shù)。


返回類型是標(biāo)準(zhǔn)的numpy.ndarray


我們?nèi)绾瓮ㄟ^這個(gè)函數(shù)傳遞我們自定義數(shù)組類型呢?NumPy允許一個(gè)類通過接口_array_ufunc和_array_function_以定義的方式處理計(jì)算。我們一次取一個(gè)_array_ufunc_。這個(gè)方法涵蓋了通用函數(shù)(ufunc),這是一類函數(shù),其中包括numpy.multiply和numpy.sin。

該_array_ufunc_接收:

1.ufunc,類似numpy.multiply

2.method,一個(gè)字符串,區(qū)分numpy.multiply(…)和類似的變體,如numpy.multiply.outer,numpy.multiply.accumulate等等。通常情況下,numpy.multiply(…),method==‘_call_’

3.inputs,可能是不同類型的混合物

4.kwargs,將關(guān)鍵字參數(shù)傳遞給函數(shù)

在下面示例中,我們將僅處理方法_call_


現(xiàn)在我們的自定義數(shù)組類型通過numpy函數(shù)傳遞。


在這一點(diǎn)上arr+3是行不通的


為了支持它,我們需要定義Python接口add、It等來分派給相應(yīng)的ufunc,我們可以通過繼承mixin來方便地實(shí)現(xiàn)這一點(diǎn)。



接下來我們來解決_array_function_。我們將創(chuàng)建字典,將NumPy函數(shù)映射到我們的自定義變體。


一個(gè)簡潔的模式是定義一個(gè)裝飾器實(shí)現(xiàn),可以用來向已處理函數(shù)添加函數(shù)。


現(xiàn)在,我們?yōu)閷?shí)現(xiàn)DiagonalArray編寫NumPy函數(shù)。為了支持arr.sum()的用法,添加一個(gè)調(diào)用numpy.sum(self)的方法sum,并且均值也是如此。


如果我們嘗試使用HANDLED_FUNCTIONS中未包含的任何NumPy函數(shù),則NumPy會(huì)引發(fā)TypeError,指示不支持此操作。例如,鏈接兩個(gè)DiagonalArrays不會(huì)產(chǎn)生另一個(gè)對角線數(shù)組,因此不支持它。


此外,sum和mean的實(shí)現(xiàn)不接受NumPy的實(shí)現(xiàn)所接受的可選參數(shù)。


我們可以選擇使用numpy.asarray轉(zhuǎn)換為普通numpy.ndarray,并以此出使用標(biāo)準(zhǔn)Numpy。


如果你想學(xué)習(xí)Python,但是找不到學(xué)習(xí)路徑和資源,歡迎上指尖編程

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容