子数组ndarray具有更新的属性

时间:2018-07-16 06:44:40

标签: python numpy subclassing

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

0 个答案:

没有答案