gpt4 book ai didi

python - 在转换期间将 numpy ndarray 子类保留为返回值。设置 __array_priority__ 安全吗?

转载 作者:太空狗 更新时间:2023-10-30 00:19:49 25 4
gpt4 key购买 nike

我正在尝试子类化 numpyndarray 类,并且运气不错。我想要的行为与 example 几乎完全相同在文档中给出。我想向数组添加一个参数 name(我用它来跟踪数据最初来自哪里)。

class Template(np.ndarray):
"""A subclass of numpy's n dimensional array that allows for a
reference back to the name of the template it came from.
"""
def __new__(cls, input_array, name=None):
obj = np.asarray(input_array).view(cls)
obj.name = name
return obj

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

这有效,除了像this question , 我希望涉及我的子类的任何转换都返回我的子类的另一个实例

有时 numpy 函数会返回 Template 的实例:

>>> a = Template(np.array([[1,2,3], [2,4,6]], name='from here')
>>> np.dot(a, np.array([[1,0,0],[0,1,0],[0,0,1]]))
Template([[1, 2, 3],
[2, 4, 6]])

但是,有时他们不会:

>>> np.dot(np.array([[1,0],[0,1]]), a)
array([[1, 2, 3],
[2, 4, 6]])

在我上面链接的问题中,建议 OP 应该覆盖子类的 __wrap_array__ 方法。但是,我认为这没有任何理由。在某些情况下,我会使用默认的 __array_wrap__ 获得预期的行为。 The docs似乎暗示我遇到了这样一种情况,即另一个参数的 __array_wrap__ 方法被调用是因为更高的 __array_priority__ 值:

Note that the ufunc (np.add) has called the __array_wrap__ method of the input with the highest __array_priority__ value

所以我的问题有几个相关的部分。第一:我可以设置子类的 __array_priority__ 属性,使其 __array_wrap__ 总是被调用吗?第二:这是最好的吗/实现我想要的行为的最简单方法?

最佳答案

当两个对象具有相同的__array_priority__时:

>>> np.array([[1,0],[0,1]]).__array_priority__
0.0
>>> a.__array_priority__
0.0

并且只能使用一个对象的方法,平局通过使用第一个数组/对象的方法来解决。 (在你的例子中是 __array_wrap__)

从这个问题看来,您的类的方法似乎应该始终是首选,因为它们是相同的(通过继承)或被覆盖。

所以我会调高 __array_priority__。

class Template(np.ndarray):
__array_priority__ = 1.0 (Or whichever value is high enough)
...

无论模板对象在计算中的哪个位置,执行此操作后。它的方法将优于标准数组的方法。

关于python - 在转换期间将 numpy ndarray 子类保留为返回值。设置 __array_priority__ 安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10456229/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com