__numpy_ufunc__()的用法

4
我正在尝试使用在Numpy v1.11文档中这里解释的__numpy_ufunc__()方法,来覆盖ndarray子类上numpy ufunc的行为,但它似乎从未被调用。尽管这种用例在指南中列出,但我找不到任何实际使用__numpy_ufunc__()的示例。有人尝试过吗?这是一个最简示例:
# Check python version
import sys
print(sys.version)

3.5.1 |Continuum Analytics, Inc.| (默认值,2016年6月15日,15:32:45)

[GCC 4.4.7 20120313(Red Hat 4.4.7-1)

# Check numpy version
import numpy as np
print(np.__version__)

1.11.2

# Subclass ndarray as discussed in 
# https://docs.scipy.org/doc/numpy/user/basics.subclassing.html
class Function(np.ndarray):

    # Create subclass object by view
    def __new__(cls):
        obj = np.asarray([1,2,3]).view(cls)
        return obj

    # I'm not even adding anything functionality yet
    def __array_finalize(self,obj): pass

    # Override ufuncs
    def __numpy_ufunc__(ufunc, method, i, inputs, **kwargs):
        print("In PF __numpy_ufunc__")
        # do other stuff here if I want to 
        # and probably need to return a value...

# Create two Functions
f1=Function()
f2=Function()

# Check that they are correctly initialized as Function objects
# not just ndarrays
print(type(f1),type(f2))

⟨class 'main.Function'⟩ ⟨class 'main.Function'⟩

# Add using operator
f1+f2

函数([2, 4, 6])

# Add, explicitly demanding a numpy ufunc
np.add(f1,f2)

Function([2, 4, 6])

很明显,子类化起作用了,并且在幕后使用numpy添加数组。 我正在使用足够新的numpy版本来使用__numpy_ufunc__()功能(根据文档页面,它是v1.11中的新功能)。 但是此代码从未打印出"In PF __numpy_ufunc__"。 为什么?


1
奇怪...我本来期望文档会列出一个 self 参数或者说明这应该是一个 staticmethodclassmethod - user2357112
1
我认为ndarray没有自己的__numpy_ufunc__,所以你可能不应该尝试通过super来调用它。 - user2357112
@user2357112,我在两个方面都同意你的看法。我将删除那个super行,因为我不想让这个问题变得混乱。 - Sam Bader
1
@user2357112,整个事情似乎目前都被禁用了,请参见此处,因此这将是文档不同步的情况。真的很烦人,我花了相当长的时间想弄清楚我做错了什么。 - Paul Panzer
1个回答

2
这一功能最终在Numpy 1.13版中以新名称发布:

新增__array_ufunc__

这是重命名和重新设计的__numpy_ufunc__。任何类,无论是否为ndarray子类,都可以定义此方法或将其设置为None,以覆盖NumPy ufunc的行为。这与Python的__mul__和其他二元操作例程非常相似。有关此新选项实现和行为的更详细描述,请参见文档。该API仍处于临时状态,我们尚未保证向后兼容性,因为可能会根据反馈进行修改。有关更多详细信息,请参见NEP文档

这应该解决这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接