【问题标题】:How to force "a+b" to always call "b.radd(a)" when a is numpy array, and b is my type?当a是numpy数组并且b是我的类型时,如何强制“a + b”始终调用“b.radd(a)”?
【发布时间】:2016-09-04 17:11:34
【问题描述】:

谁能看到解决标题问题的好方法?当numpy 为添加到我的自定义数据类型(如here)而做了一些愚蠢的事情并且我想覆盖它的行为时,它就会出现

我在强制规则的官方文档中找到了this,它说如果“b”的类是numpy 数组类型的子类,则可以这样做,但它不是最理想的,因为我不希望我的类型子类ndarray

【问题讨论】:

  • 一个最小的工作示例会很有帮助。为什么不想从ndarray 继承?

标签: python numpy


【解决方案1】:

使用 numpy 使用的__array_priority__ 属性来指示您的类型具有更高的优先级。例如。

import numpy as np

class MyClass:

    __array_priority__ = 0

    def __init__(self, data):
        self.arr = np.array(data)

    def __array__(self):
        return self.arr

    def __radd__(self, other):
        return "MyClass radd"

a = np.array([1])
b = MyClass([2])

# low priority (or no priority), numpy array addition
assert isinstance(a + b, np.ndarray)

# higher priority, your addition
MyClass.__array_priority__ = 1
assert a + b == "MyClass radd"

【讨论】:

    【解决方案2】:

    可以通过猴子补丁来完成,例如:

    old_add = np.ndarray.__add__
    
    def new_add(self, other):
        if isinstance(other, MyType):
            return other.__radd__(self)
        else:
            return old_add(self, other)
    
    np.ndarray.__add__ = new_add
    

    这通常会引发错误can't set attributes of built-in/extension type 'numpy.ndarray'。根据this 有一个解决方法,我让你自己试试。

    【讨论】:

      猜你喜欢
      • 2016-03-01
      • 2019-10-27
      • 2019-03-22
      • 2014-03-29
      • 2015-12-19
      • 2017-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多