如何子类化ndarray来累计记录加法运算符的个数?
How to Subclassing ndarray to cumulatively record the number of addition operators?
我正在使用 Python 并且我正在尝试构建一个 class,例如 Numbers
,使用 Subclassing ndarray。我希望我的 class 满足以下两个属性:
numpy
的所有方法都适用于我的classNumbers
。 (这就是我选择使用 Subclassing ndarray 的原因。)
- 每次我在class
Numbers
的两个实例之间进行加法,我可以累计记录我使用的加法次数。
这是我试过的
import numpy as np
class Numbers(np.ndarray):
nb_add = 0
def __new__(cls, values):
self = np.asarray(values).view(cls)
return self
def __add__(self, new_numbers):
Numbers.nb_add += len(new_numbers)
return self + new_numbers
a = Numbers([1,2,3,4])
b = Numbers([5,6,7,8])
c = a+b
print(a.reshape(2, 2)) # expect [[1,2], [3,4]]
print(Numbers.nb_add)# expect 4 = number of addtions
但是方法__add__
会出错。
我找到了一个类似的 post here,但我要找的不是这种情况。
有人能帮帮我吗?谢谢!
问题是表达式 self + new_numbers
引用了 Numbers 的 __add__
方法,因此该方法调用了自身。
如果显式调用基class的__add__
方法,那么你会得到你想要的结果:
import numpy as np
class Numbers(np.ndarray):
nb_add = 0
def __new__(cls, values):
self = np.asarray(values).view(cls)
return self
def __add__(self, new_numbers):
Numbers.nb_add += len(new_numbers)
return np.ndarray.__add__(self,new_numbers)
a = Numbers([1,2,3,4])
b = Numbers([5,6,7,8])
c = a+b
print(a.reshape(2, 2)) # expect [[1,2], [3,4]]
print(Numbers.nb_add)# expect 4 = number of addtions
我正在使用 Python 并且我正在尝试构建一个 class,例如 Numbers
,使用 Subclassing ndarray。我希望我的 class 满足以下两个属性:
numpy
的所有方法都适用于我的classNumbers
。 (这就是我选择使用 Subclassing ndarray 的原因。)- 每次我在class
Numbers
的两个实例之间进行加法,我可以累计记录我使用的加法次数。
这是我试过的
import numpy as np
class Numbers(np.ndarray):
nb_add = 0
def __new__(cls, values):
self = np.asarray(values).view(cls)
return self
def __add__(self, new_numbers):
Numbers.nb_add += len(new_numbers)
return self + new_numbers
a = Numbers([1,2,3,4])
b = Numbers([5,6,7,8])
c = a+b
print(a.reshape(2, 2)) # expect [[1,2], [3,4]]
print(Numbers.nb_add)# expect 4 = number of addtions
但是方法__add__
会出错。
我找到了一个类似的 post here,但我要找的不是这种情况。
有人能帮帮我吗?谢谢!
问题是表达式 self + new_numbers
引用了 Numbers 的 __add__
方法,因此该方法调用了自身。
如果显式调用基class的__add__
方法,那么你会得到你想要的结果:
import numpy as np
class Numbers(np.ndarray):
nb_add = 0
def __new__(cls, values):
self = np.asarray(values).view(cls)
return self
def __add__(self, new_numbers):
Numbers.nb_add += len(new_numbers)
return np.ndarray.__add__(self,new_numbers)
a = Numbers([1,2,3,4])
b = Numbers([5,6,7,8])
c = a+b
print(a.reshape(2, 2)) # expect [[1,2], [3,4]]
print(Numbers.nb_add)# expect 4 = number of addtions