根據suggestion by hpaulj我想通過查看np.ma.core.MaskedArray.__eq__
來了解如何做到這一點。這是參考的最小實現。主要想法是在DerivedArray
的基類的類型中以self
的視圖調用numpy __eq__()
。
class DerivedArray(np.ndarray):
def __new__(cls, input_array, prop1, prop2):
_baseclass = getattr(input_array, '_baseclass', type(input_array))
obj = np.asarray(input_array).view(cls)
obj._prop1 = prop1
obj._prop2 = prop2
obj._baseclass = _baseclass
return obj
def __array_finalize__(self, obj):
if obj is None:
return
else:
if not isinstance(obj, np.ndarray):
_baseclass = type(obj)
else:
_baseclass = np.ndarray
self._prop1 = getattr(obj, '_prop1', None)
self._prop2 = getattr(obj, '_prop2', None)
self._baseclass= getattr(obj, '_baseclass', _baseclass)
def _get_data(self):
"""Return the current data, as a view of the original
underlying data.
"""
return np.ndarray.view(self, self._baseclass)
_data = property(fget=_get_data)
data = property(fget=_get_data)
def __eq__(self, other):
attsame = (self._prop1 == other._prop1) and (self._prop2 == other._prop2)
if not attsame: return False
return self._data.__eq__(other)
看起來像'ndarray'返回標量如果屬性(例如形狀)不匹配則爲真/假,只有匹配時才返回布爾數組。使用一個或'ifs',如果它們失敗,你應該能夠返回屬性測試,'else'返回'data'測試。讓自己多次'返回'。以這種方式編寫代碼更容易。 – hpaulj
@hpaulj分隔我的自定義屬性和底層數據的比較是一個很好的建議。但是,問題仍然是數據屬性本身的比較返回一個布爾值,而不是數組。我如何從比較運算符調用numpy的按元素進行比較? – deepak
看看masked數組如何處理這個:'np.ma.core.MaskedArray .__ eq__' – hpaulj