2017-04-19 33 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

相关问题