NumPy基礎-編寫自定義陣列容器

語言: CN / TW / HK

我們可以使用NumPy中引入的NumPy的分配機制來編寫與NumPy API相容並提供NumPy功能的自定義實現的自定義n維陣列容器,應用程式包括dask陣列(分佈在多個節點上的n維陣列)和cupy陣列(GPU上的n維陣列 )。

下面示例的實用程式不常用,但說明了所涉及的概念。

我們自定義陣列可以像這樣例項化:

我們可以使用numpy.array或numpy.asarray轉換為numpy陣列,這將呼叫其_array_方法以獲得標準numpy.ndarray。

如果我們使用numpy函式對arr進行操作,numpy將再次使用array介面將其轉換為陣列,然後以通常的方式使用該函式。

返回型別是標準的numpy.ndarray

我們如何通過這個函式傳遞我們自定義陣列型別呢?NumPy允許一個類通過介面_array_ufunc和_array_function_以定義的方式處理計算。我們一次取一個_array_ufunc_。這個方法涵蓋了通用函式(ufunc),這是一類函式,其中包括numpy.multiply和numpy.sin。

該_array_ufunc_接收:

1.ufunc,類似numpy.multiply

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

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

4.kwargs,將關鍵字引數傳遞給函式

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

現在我們的自定義陣列型別通過numpy函式傳遞。

在這一點上arr+3是行不通的

為了支援它,我們需要定義Python介面add、It等來分派給相應的ufunc,我們可以通過繼承mixin來方便地實現這一點。

接下來我們來解決_array_function_。我們將建立字典,將NumPy函式對映到我們的自定義變體。

一個簡潔的模式是定義一個裝飾器實現,可以用來向已處理函式新增函式。

現在,我們為實現DiagonalArray編寫NumPy函式。為了支援arr.sum()的用法,新增一個呼叫numpy.sum(self)的方法sum,並且均值也是如此。

如果我們嘗試使用HANDLED_FUNCTIONS中未包含的任何NumPy函式,則NumPy會引發TypeError,指示不支援此操作。例如,連結兩個DiagonalArrays不會產生另一個對角線陣列,因此不支援它。

此外,sum和mean的實現不接受NumPy的實現所接受的可選引數。

我們可以選擇使用numpy.asarray轉換為普通numpy.ndarray,並以此出使用標準Numpy。

如果你想學習Python,但是找不到學習路徑和資源,歡迎上指尖程式設計

分享到: