了解`np.ndarray`子类中的默认值 - python

我正在研究numpy documentation on subclassing ndarray,但是在设置默认值方面,我观察到的结果与所描述的略有不同。该文档似乎说应该使用一个位置来设置额外属性的默认值,但是我发现有必要在两个位置保持正确的默认值。

考虑在文档中描述的realistic example,此处转载(为简洁起见,注释已重新格式化):

import numpy as np

class RealisticInfoArray(np.ndarray):

    def __new__(cls, input_array, info=None):
        obj = np.asarray(input_array).view(cls)
        obj.info = info
        return obj

    def __array_finalize__(self, obj):
        # Note that it is here, rather than in the __new__ method,
        # that we set the default value for 'info', because this
        # method sees all creation of default objects - with the
        # InfoArray.__new__ constructor, but also with
        # arr.view(InfoArray).
        if obj is None: return
        self.info = getattr(obj, 'info', None)

描述默认值的生效位置的注释使我感到困惑。我替换了默认值以查看发生了什么,例如:info='michelangelo'中的__new__getattr(obj, 'info', 'donatello')中的__array_finalize__。我发现后者仅使用view创建方法设置,而前者用于显式构造函数调用和从模板创建:

>>> a = RealisticInfoArray(np.arange(10)); print(a.info)
michelangelo
>>> b = np.arange(10).view(RealisticInfoArray); print(b.info)
donatello
>>> c = a[1:]; print(c.info)
michelangelo

在这种情况下,根据我对文档的了解,a似乎采用了“错误”的默认设置。据我所知,a.info__array_finalize__中设置正确,但随后被__new__中的默认值覆盖。

首先,我犯错了吗?如果不是,是否需要在两个地方都保持预期的默认设置,或者是否有办法将其减少到一个? (我在下面的回答中对此进行了尝试,感谢您提供任何反馈。)

参考方案

我当前的解决方法(保持两个默认值除外)是提供一个类属性DEFAULT_INFO,可以同时通过__new____array_finalize__进行访问:

import numpy as np

class RealisticInfoArray(np.ndarray):

    DEFAULT_INFO = 'michelangelo'

    def __new__(cls, input_array, info=None):
        obj = np.asarray(input_array).view(cls)
        if info is None:
            info = obj.DEFAULT_INFO
        obj.info = info
        return obj

    def __array_finalize__(self, obj):
        if obj is None: return
        self.info = getattr(obj, 'info', self.DEFAULT_INFO)

正确产生:

>>> a = RealisticInfoArray(np.arange(10)); print(a.info)
michelangelo
>>> b = np.arange(10).view(RealisticInfoArray); print(b.info)
michelangelo
>>> c = a[1:]; print(c.info)
michelangelo

这还具有一个额外的好处,即该类的用户可以修改默认值(例如RealisticInfoArray.DEFAULT_INFO = 'leonardo'),并使用他们自己认为合适的默认值。但是,我尚未测试此解决方案的意外副作用。

Python:对音乐文件执行FFT - python

我试图对我创建的歌曲(wav格式的音频文件,大约3分钟)进行FFT,以防万一它是相关的。ffmpeg -i "$1" -vn -ab 128k -ar 44100 -y -ac 1 "${1%.webm}.wav" 其中$1是webm文件的名称。这是应该显示给定文件的FFT的代码:import numpy as np …

pd.NA vs np.nan的熊猫 - python

pd.NA vs np.nan表示熊猫。与熊猫一起使用哪一个,为什么要使用?每个大熊猫的主要利弊是什么?一些同时使用它们的示例代码:import pandas as pd import numpy as np df = pd.DataFrame({ 'object': ['a', 'b', …

我们如何只替换特定行中的NaN? - python

我只需要在数据框的特定行中替换NaN值。我原来的样子是这样的:import pandas as pd import numpy as np pd.DataFrame.from_dict({'col1': 'A B A D E B C D E A'.split(), 'col2': [np.nan, …

Python中的矩阵大小 - python

a是2x2矩阵b是2x1矩阵c是1x2矩阵但是... d是什么样的矩阵?import numpy as np a= np.array([[1,2],[3,4]]) b= np.array([[1],[2]]) c= np.array([[1,2]]) d= np.array([1,2]) Variable explorer python参考方案 变量d不是矩…

Python GPU资源利用 - python

我有一个Python脚本在某些深度学习模型上运行推理。有什么办法可以找出GPU资源的利用率水平?例如,使用着色器,float16乘法器等。我似乎在网上找不到太多有关这些GPU资源的文档。谢谢! 参考方案 您可以尝试在像Renderdoc这样的GPU分析器中运行pyxthon应用程序。它将分析您的跑步情况。您将能够获得有关已使用资源,已用缓冲区,不同渲染状态上…