Python-如何实现与NumPy函数兼容的自定义类?
我试图实现自己的自定义类来存储数据。我想让它与NumPy兼容,这样我就可以像这样调用NumPy函数:Python-如何实现与NumPy函数兼容的自定义类?,python,arrays,class,numpy,interface,Python,Arrays,Class,Numpy,Interface,我试图实现自己的自定义类来存储数据。我想让它与NumPy兼容,这样我就可以像这样调用NumPy函数: np.sin(my_object) 我知道有一本字典叫做\uuuuu数组\uu接口\uuuuu,但是我在尝试使用它时遇到了很多奇怪的错误 import numpy as np import pandas as pd class TDF: __array_interface__ = {'typestr': '|i1', 'version': 1} def __init__(s
np.sin(my_object)
我知道有一本字典叫做\uuuuu数组\uu接口\uuuuu
,但是我在尝试使用它时遇到了很多奇怪的错误
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.
我错过了什么?
另一方面,pandas的源代码(与NumPy兼容的类)没有明确使用数组_接口dict..您没有访问存储在对象中的数据。变量
tdf1
只是TDF实例,但数据存储在tdf1.ddata
中。尝试调用np.sin(tdf1.ddata)
一个简单的修复方法就是实现
def __array__(self):
return self.ddata
很好。这确实是解决问题的方法,但关键是无缝地访问存储在对象中的数据,而不直接指向它。在pandas对象上使用numpy函数时,不需要指定pandas存储数据的变量internally@TomaszR:尝试
def\uuuu数组\uuuuu(self):返回np.array(self.ddata)
@Grr:如果您有\uuu数组接口\uuuuuu
属性,则永远不会调用\uu数组\uuuu
。但是,意识到这不是@Tomasz R想要的,它只是从pandas.column
到np.array
的类型转换。至于现在,我认为这是最接近的解决办法。谢谢大家。是的,数组就足够了,不能和数组_接口放在一起。如果希望返回的值为自定义类型,还必须实现array_wrapThanks。是的,这就是我们所需要的。如果你想让一个numpy函数的结果成为你的自定义类型,你还必须添加array\u wrap.方法,有时还要添加\uu array\u prepare\uu
。很快就会来到你身边的一个小天体:\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
,它比\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu