【发布时间】:2015-12-04 04:57:17
【问题描述】:
按照here 的说明,我创建了一个 ndarray 的子类,它为 ndarray 类添加了新属性。现在我想为新类定义一个比较运算符,它除了比较数据之外,还比较属性的值。所以我尝试了这个:
def __eq__(self, other):
return (self._prop1 == other._prop1) and \
(self._prop2 == other._prop2) and \
(self.data == other.data)
这允许像T1 == T2 这样的比较并返回一个布尔值。但是,由于我想将这些数组与其他 ndarray 互换使用,我希望比较返回一个布尔数组。如果我没有定义我的__eq__ 函数,那么比较会返回一个布尔数组,但是我无法检查属性。如何将两者结合起来?
【问题讨论】:
-
看起来
ndarray如果属性(例如形状)不匹配,则返回标量 True/False,并且仅当它们都匹配时才返回布尔数组。使用一个或ifs,如果它们失败,您应该能够返回您的属性测试,并且else返回data测试。允许自己多个returns。这样写代码更容易。 -
@hpaulj 将我的自定义属性和基础数据的比较分开是一个不错的建议。但是,问题仍然是数据属性的比较本身返回的是布尔值,而不是数组。如何从比较运算符中调用 numpy 的逐元素比较?
-
看看掩码数组是如何处理这个问题的:
np.ma.core.MaskedArray.__eq__