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

2021-10-22 23:15:17 字數 2102 閱讀 4544

我們可以使用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,但是找不到學習路徑和資源,歡迎上指尖程式設計。

編寫自定義特性

自定義特性一般標註在作用的程式元素的上方 編譯器首先組合特性名稱和attribute,然後尋找該組合名,所以特性名為fieldname和fieldnameattribute的兩個特性沒有區別 編譯器將尋找包含有這個名稱的類,它直接或者間接的派生資system.attribute 編寫自定義類的步驟 ...

編寫自定義GenericServlet

具體步驟如下 1 新建類mygenericservlet,實現servlet,servletconfig介面 2 重寫父類的相關方法 3 將service 方法定義為抽象 abstract 方法,將類定義為抽象類,以便在子類予以service 方法新的實現 4 定義mygenericservlet的...

自定義陣列

陣列是一種容器,最簡單的資料結構,其實體地址是連續的,所以,其長度是固定的。陣列一旦定義 資料型別,長度均被固定,所以不能實現增加刪除的操作 一.簡單定義 建立乙個學生類,在測試檔案中定義乙個學生類的陣列用來存放學生資訊 public class student public void study ...