2017-04-19 57 views
1

我想實現我自己的自定義類來存儲數據。嘗試使用時Python - 如何實現與NumPy函數兼容的自定義類?

np.sin(my_object) 

我知道有一個叫__array_interface__字典,但是我得到很多奇怪的錯誤:我希望把它與NumPy的兼容,所以,我可以打電話NumPy的功能,它是這樣它。

import numpy as np 
import pandas as pd 

class TDF: 
    __array_interface__ = {'typestr': '|i1', 'version': 1} 

    def __init__(self): 
     self.ddata = pd.DataFrame([1, 2, 3]) 
     self.shape = self.ddata.shape 

    def __iter__(self): 
     return iter(self.ddata) 

    def __len__(self): 
     return len(self.ddata) 

    def __getitem__(self, key): 
     return self.ddata.__getitem__(key) 

if __name__ == '__main__': 
    tdf1 = TDF() 
    tdf = np.sin(tdf1) 

上面的代碼給了我一個運行時錯誤:

ValueError: setting an array element with a sequence. 

我缺少什麼? 在另一方面大熊貓(哪些類與NumPy兼容)的源代碼沒有明確使用array_interface字典...

回答

1

一個簡單的解決將是實現

def __array__(self): 
    return self.ddata 
+1

謝謝。是的 - 那是需要的。如果你想讓numpy函數的結果成爲你的自定義類型,你還必須添加__array_wrap__方法。 –

+0

有時也有'__array_prepare__'。即將到來你附近的一個numpy:'__array_ufunc__',它對'__array_wrap__'做了更好的工作 – Eric

0

您沒有訪問您存儲在對象中的數據。變量tdf1就是TDF實例,但數據存儲在tdf1.ddata中。嘗試調用np.sin(tdf1.ddata)

+0

非常好。這確實是修復 – kmario23

+1

但是,重點是無縫地訪問存儲在對象中的數據,而不直接指向它。當你在pandas對象上使用numpy函數時,你不需要指定pandas內部存儲數據的變量 –

+0

@Tomasz R:嘗試'def __array __(self):return np.array(self.ddata)' – stovfl

相關問題