Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-如何实现与NumPy函数兼容的自定义类?_Python_Arrays_Class_Numpy_Interface - Fatal编程技术网

Python-如何实现与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

我试图实现自己的自定义类来存储数据。我想让它与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__(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