quantities.Quantity
是{__array__
-方法,但只起到80%的作用,正如您最后看到的:
class Numeric(object):
def __init__(self, signal):
self.signal = signal
self._dimensionality = self.signal._dimensionality
self.dimensionality = self.signal.dimensionality
def __array__(self):
return self.signal
def __mul__(self, obj):
return self.signal.__mul__(obj)
def __rmul__(self, obj):
return self.signal.__rmul__(obj)
我可以这样做:
^{pr2}$以下所有操作都返回正确的单位--除了最后一个操作,该单位丢失了:
print num * num
# [1 4 9] mV**2
print num * q
# [ 2 6 12] mV**2
print num * n
# [ 3 8 15] mV
print q * num
# [ 2 6 12] mV**2
print n * num
# [ 3 8 15] <------- no unit!
有没有办法,怎样才能保持正确的单位?在
编辑:算术运算的返回类型/值应等于:
num.signal * num.signal
num.signal * q
num.signal * n
q * num.signal
n * num.signal # this doesn't work
您需要定义
__array_wrap__
。见the documentation here。在作为一个使用示例的快速示例(但不需要
quantities
):这就产生了:
^{pr2}$如果我们包括
__array_wrap__
:它产生:
但是,我还是很困惑为什么你不能一开始就把
ndarray
子类化。。。我想从长远来看会干净很多。如果你不能,你就不能。在要完全模仿
ndarray
而不子类化ndarray
,您需要非常熟悉the details of subclassing them。在根据the python reference,,右操作数的
__rmul__
是“仅当左操作数不支持相应的操作且操作数类型不同时才调用”所以问题是当你运行}不兼容
n * num.signal
,numpy.array
确实支持乘法并接管了它。我看到的唯一方法是如果有一种方法使Numeric
与{当Python看到
x * y
时,会发生以下情况:y
是x
>;的子类,则调用y.__rmul__(x)
否则:
IF
x.__mul__(y)
返回NotImplemented
(这与raise NotImplementedError
不同)y.__rmul__(x)
被调用因此,}不能与{}相乘。在
__rmul__
可以被称为子类ndarray
,或者{您无法子类化,而且显然
ndarray
很乐意与Numeric
一起工作,所以。谢天谢地,
numpy
的人准备好了这样的情况答案在于__array_wrap__
方法:我们使用原始的
signal
类和原始维度,为新的Numeric
对象创建一个新信号。在整个比特看起来像这样:
^{pr2}$跑步时:
相关问题 更多 >
编程相关推荐