0

我想创建一个对象的实例,就像 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 修复了这个错误。我不知道发生了什么。

4

0 回答 0