我想像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可修复此错误。我不知道发生了什么。