我想创建一个对象的实例,就像 a 一样,np.ndarray
但增加了调用apply_gain(gain)
简单添加到数组中的方法的能力,同时还可以将平均值计算为属性 ( .dBFS
)。
我在下面写了一个我打算做的例子,它似乎产生了正确的输出。d.mean()
但是,当我在现实世界的应用程序中使用它时,经过多次切片和操作,我偶尔会发现和之间存在差异d.dBFS
。
编辑:我在下面包含了一个最小的错误示例。虽然以下代码运行正常
class MyArray(np.ndarray):
def __new__(cls, inputarr):
obj = np.asarray(inputarr).view(cls)
obj.dBFS = obj.mean()
return obj
def apply_gain(self, gain):
return self + gain
def __array_finalize__(self, obj):
if obj is None: return
self.dBFS = self.mean()
d=MyArray(np.array([1,2,3]))
print(d[0:2].dBFS, d[0:2].mean())
>>>1.5 1.5
print(d[0:2].apply_gain(2))
>>>[3,4]
以下代码显示了该错误:
import unittest
class MyArrayTestCase(unittest.TestCase):
def test_a(self):
d=MyArray(np.array([1,2,3]))
print(float((d[0:2]+d[0:2]).dBFS)) #print 3.0
np.testing.assert_array_equal((d[0:2]+d[0:2]).dBFS, (np.array([1,2,3])[0:2]+np.array([1,2,3])[0:2]).mean())
def test_b(self):
d=MyArray(np.array([1,2,3]))
print(float((d[0:2]+d[0:2]).dBFS)) # print3.5
np.testing.assert_array_equal((d[0:2]+d[0:2]).dBFS, (np.array([1,2,3])[0:2]+np.array([1,2,3])[0:2]).mean())
def test_add_2_gain_slice(self):
d=MyArray(np.array([1,2,3]))
np.testing.assert_array_equal(d[0:2].apply_gain(2), np.array([1,2,3])[0:2]+2)
输出 ...3.0 3.5
----------------------------------------------------------------------
Ran 3 tests in 0.201s
OK
请注意,相同的函数会同时打印 3.0 和 3.5。删除 test_add_2_gain_slice 修复了这个错误。我不知道发生了什么。