使用__numpy_ufunc __()

时间:2017-01-05 21:15:13

标签: python numpy numpy-ufunc

我正在尝试使用解释here in the Numpy v1.11 docs__numpy_ufunc__()方法来覆盖ndarray的子类上的numpy ufuncs的行为,但它似乎永远不会被调用。尽管指南中列出了这个用例,但我找不到任何实际使用__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)

功能([2,4,6])

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

1 个答案:

答案 0 :(得分:2)

此功能最终以Numpy 1.13的新名称发布:

  

DIFFERENCE已添加

     

这是重命名并重新设计的__array_ufunc__。任何类,ndarray子类是否可以定义此方法或将其设置为None以覆盖NumPy的ufuncs的行为。这与Python的__numpy_ufunc__和其他二进制操作例程非常相似。有关此新选项的实现和行为的更详细说明,请参阅文档。 API是临时的,我们尚不保证向后兼容性,因为可能会在等待反馈之前进行修改。有关详细信息,请参阅NEPdocumentation

这应解决此问题。