2010-02-28 78 views
20

我正在創建一個numpy數組,用來填充我創建的特定類的對象。我想初始化數組,使它只會包含那個類的對象。例如,以下是我想要做的事情,以及如果我這樣做會發生什麼。numpy數組中的自定義數據類型

class Kernel: 
    pass 

>>> L = np.empty(4,dtype=Kernel) 

TypeError: data type not understood 

我可以這樣做:

>>> L = np.empty(4,dtype=object) 

然後的L每個元素分配爲Kernel對象(或任何其他類型的對象)。從編程的角度(類型檢查)和數學的(對函數集的操作),我可以得到一組Kernels。

有沒有什麼辦法讓我指定一個任意類的numpy數組的數據類型?

回答

18

如果你的Kernel類有可預測的成員數據量,那麼你可以爲它定義一個dtype而不是一個類。例如如果它是由9個浮標和一個int參數,你可以做

kerneldt = np.dtype([('myintname', np.int32), ('myfloats', np.float64, 9)]) 
arr = np.empty(dims, dtype=kerneldt) 

你必須做一些強制要操縱單個內核的方法,每次將它們變成類內核對象,但是這是一個將實際數據存儲在NumPy數組中的方法。如果你只想存儲一個引用,那麼對象dtype是沒有子類化ndarray的最佳選擇。

+0

這就是我一直在尋找的!儘管我開始認爲它的價值遠遠超過它的價值......請閱讀np.dtype。 – 2010-03-01 15:01:15

1

據我所知,執行單一類型的用於在元件一個numpy.ndarray必須手動完成(除非該數組包含Numpy標量):沒有內置的檢查機制(您的數組有dtype = object)。如果您確實想要強制實施單一類型,則必須將子類化並使用適當方法(__setitem__等)執行檢查。

如果您想要對一組函數(內核對象)執行操作,您可以通過直接在您的內核類中定義適當的操作來完成操作。這是我爲我的uncertainties.py模塊所做的,該模塊處理帶有不確定性的數字的numpy.ndarrays。