我可以通过未绑定的成员方法创建Python Numpy ufunc吗?

问题描述

| 我想使用numpy.frompyfunc从未绑定成员方法生成未绑定ufunc。我具体但失败的尝试看起来像
class Foo(object):
    def f(x,y,z):
        return x + y + z

Foo.g = numpy.frompyfunc(Foo.f,3,1)
i = Foo()
i.g(5,6,7)
最后一行失败的地方 \“ TypeError:必须以Foo实例作为第一个参数来调用未绑定的方法f()(改为使用int实例)\”。这个错误对我来说很有意义,因为Foo.f是不受限制的。 尽管已弃用,但我还是想尝试一下new.instance方法
import new
Foo.h = new.instancemethod(numpy.frompyfunc(Foo.f,1),None,Foo)
j = Foo()
j.h(5,7)
现在,最后一行失败并带有\“ TypeError:返回数组必须为ArrayType \”,我不明白。 我的目标是为猴子提供Fufunc-ready版本的补丁。它们必须是成员方法,因为它们取决于Foo实例的状态(尽管此处未显示该依赖关系)。 有什么建议么?     

解决方法

import numpy as np

class Foo(object):
    def f(self,x,y,z):
        return x + y + z
Foo
中添加
g
方法:
def g(self,z):
    return np.frompyfunc(self.f,3,1)(x,z)
Foo.g = g
Foo
实例调用
g
i = Foo()
print(i.g(np.array([5,6]),np.array([6,7]),np.array([7,8])))
# [18 21]
    ,我必须承认,我不太了解为什么要让f和g进入Foo类,但是可以使用以下方法:
>>> class Foo(object):
...     @staticmethod
...     def f(x,z):
...             return x+y+z
...
>>> Foo.g = numpy.frompyfunc(Foo.f,1)
>>> i = Foo()
>>> i.g(5,6,7)
18
编辑:由于您想在方法中使用实例数据,因此您实际需要的是绑定方法:
>>> class Foo(object):
...     def f(self,z):
...             return x+y+z
...
>>> i = Foo()
>>> i.g = numpy.frompyfunc(i.f,1)
>>> i.g(5,7)
18
当然,在实际代码中,您可能希望在
Foo.__init__
中分配g,而不是在类之外:
>>> class Foo(object):
...     def __init__(self):
...             self.g = numpy.frompyfunc(self.f,1)
...     def f(self,z):
...             return x+y+z
...
>>> i = Foo()
>>> i.g(5,7)
18