gpt4 book ai didi

python - 创建一个 numpy 数组子类,其中所有形状更改操作都返回一个普通数组

转载 作者:太空狗 更新时间:2023-10-29 21:59:02 25 4
gpt4 key购买 nike

我有一个数组子类,其中一些额外的属性只对对象的原始形状有效。有没有办法确保所有数组形状更改操作都返回一个普通的 numpy 数组而不是我的类的实例?

我已经写了 array_wrap,但这似乎对 np.meannp.sumnp. 等操作没有任何影响。滚动轴。这些都只返回我的类的一个实例。

import numpy as np    

class NewArrayClass(np.ndarray):
__array_priority__ = 3.0
def __array_wrap__(self, out_arr, context=None):
if out_arr.shape == self.shape:
out = out_arr.view(new_array)
# Do a bunch of class dependant initialization and attribute copying.
# ...
return out
else:
return np.asarray(out_arr)

A = np.arange(10)
A.shape = (5, 2)
A = arr.view(NewArrayClass)
# Would like this to be np.ndarray, but get new_array_class.
print type(np.sum(A, 0))

我想我必须在 __new____array_finalize__ 中做一些事情,但我不知道是什么。

更新:在仔细阅读关于子类化的 numpy 文档(http://docs.scipy.org/doc/numpy/user/basics.subclassing.html)后,所有数组形状更改操作都在执行“从模板新建”操作。所以问题就变成了,如何使“从模板新建”操作返回 ndarray 实例而不是我的类的实例。据我所知,这些函数中从未调用过 __new__

替代方案:假设以上不可能,我如何至少在 __array_finalize__ 中识别新的模板操作(而不是 View 转换)?这至少会让我取消引用一些通过引用复制的属性。我还可以设置一个标志或其他东西来告诉新实例它的形状无效。

最佳答案

如果您不向您的 NewArrayClass 实例引入任何新成员,您可以重新分配返回实例的 __class__ 属性。

A.__class__ = np.ndarray

重点是你为什么要做这样的事情。您是否在其他地方进行严格的类型检查?使用鸭子打字你会做得更多。

关于python - 创建一个 numpy 数组子类,其中所有形状更改操作都返回一个普通数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5474844/

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