ndarray的子類化

2021-10-12 07:25:11 字數 2461 閱讀 9570

首先是使用ndarray .__ new__方法進行物件初始化的主要工作,而不是更常用的__init__方法。實際上ndarray沒有__init__方法,因為所有初始化都在__new__方法中完成。

然後使用__array_finalize__方法,以允許子類在用檢視建立物件和從模板建立新例項之後進行清理。所有三種物件建立方法都呼叫了mysubclass .__ array_finalize__,__array_finalize__接收的引數在上述例項建立方法中不相同,因此這通常是我們物件建立內務處理的地方。

import numpy as np

class

realisticinfoarray

(np.ndarray)

:def

__new__

(cls, input_array, info=

none):

# input array is an already formed ndarray instance

# we first cast to be our class type

obj = np.asarray(input_array)

.view(cls)

# add the new attribute to the created instance

obj.info = info

# finally, we must return the newly created object:

return obj

def__array_finalize__

(self, obj)

:# see infoarray.__array_finalize__ for comments

if obj is

none

:return

self.info =

getattr

(obj,

'info'

,none

)

在子類化ndarray時,您有責任確定api與numpy的對齊方式。為了方便起見,具有相應的許多numpy的功能 ndarray的方法(例如,sum,mean,take,reshape)通過檢查第乙個引數的函式具有相同的名稱的方法工作。如果存在則呼叫該方法,而不是將引數強制為numpy陣列。

如果您希望保持與numpy及其後續版本(可能會新增新的關鍵字引數)的相容性,但又不想顯示所有numpy的引數,則函式的可以使用**kwargs。

乙個 ndarray是具有相同型別和大小的專案的多維容器。類的例項ndarray 由計算機記憶體的連續一維段組成, 並與將 n個 整數對映到塊中項的位置的索引方案相結合。 索引可以變化的範圍由shape陣列的指定。 每個專案占用多少位元組以及如何解釋位元組由與陣列關聯的資料型別物件定義。

ndarrays可以共享相同的資料, 因此在乙個ndarray中進行的更改可能在另乙個中可見。 也就是說,ndarray可以是另乙個ndarray 的 「view」 ,它所指的資料由 「base」 ndarray處理。

顯式建構函式的呼叫,是建立python例項的常用方法。

檢視轉換,將現有的ndarray轉換為給定的子類。

>>

>

import numpy as np

>>

>

# create a completely useless ndarray subclass

>>

>

class

c(np.ndarray)

:pass

>>

>

# create a standard ndarray

>>

>arr = np.zeros((3

,))>>

>

# take a view of it, as our useless subclass

>>

>c_arr = arr.view(c)

>>

>

type

(c_arr)

<

class

'c'>

從模板新建,從模板例項建立新例項。

例如從子類化陣列中返回切片,從ufunc中建立返回型別,以及複製陣列。

>>

>v = c_arr[1:

]>>

>

type

(v)# the view is of type 'c'

<

class

'c'>

>>

>v is c_arr # but it's a new instance

false

切片(slice)是原始c_arr資料的乙個檢視(view),ndarray的檢視是乙個相同類的新ndarray,它指向原始資料。

參考文件

視窗的子類化與超類化

1.子類化 改變乙個已經存在的視窗例項的性質 訊息處理與其他例項屬性。在sdk程式設計範疇內,子類化就是改變乙個視窗例項的視窗函式 通過getwindowlong 和setwindowlong 子類化所要做的就是為某視窗例項編寫新的視窗函式。其操作是在例項級別上進行的。在mfc中子類化的情況有所不同...

視窗的子類化與超類化

視窗的子類化與超類化 1.子類化 改變乙個已經存在的視窗例項的性質 訊息處理與其他例項屬性。在sdk程式設計範疇內,子類化就是改變乙個視窗例項的視窗函式 通過getwindowlong 和setwindowlong 子類化所要做的就是為某視窗例項編寫新的視窗函式。其操作是在例項級別上進行的。在mfc...

正確還原子類化的窗體,子類化正確還原

如果呼叫這個函式,就不要再呼叫 callwindowproc啦 virtual lresult ncdestroy else return lreturnvalue 說明 先判斷該視窗的窗體過程指標是否發生過變動,如果沒有的話是最好的,趕緊撤銷子類化,再把訊息傳遞給之前視窗過程,然後退出 如果發生過...