4

我正在尝试使用Numpy v1.11 文档中__numpy_ufunc__()解释的方法来覆盖 numpy ufuncs 在子类上的行为,但它似乎从未被调用。尽管指南中列出了这个用例,但我找不到任何人实际使用. 有没有人试过这个?这是一个最小的例子:ndarray__numpy_ufunc__()

# Check python version
import sys
print(sys.version)

3.5.1 |连续分析公司| (默认,2016 年 6 月 15 日,15:32:45)

[GCC 4.4.7 20120313(红帽 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__"。是什么赋予了?

4

1 回答 1

2

此功能终于在Numpy 1.13中以新名称发布:

__array_ufunc__添加

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

这应该可以解决这个问题。

于 2017-07-15T22:15:10.603 回答