gpt4 book ai didi

python - Numpy ndarray 子类 - 在 __array_finalize__ 中强制 reshape

转载 作者:行者123 更新时间:2023-11-28 20:49:13 24 4
gpt4 key购买 nike

我遇到以下问题:

我想编写一个 ndarray 子类并为该子类的任何新实例强制执行形状 (-1,3),无论它以何种方式出现 - 显式构造函数、 View 转换或来自模板。

我尝试了很多东西,但似乎都不起作用。我估计我还没有完全掌握基本过程。非常感谢任何帮助!

import numpy as np

class test(np.ndarray):
def __new__(cls, *args, **kwargs):
return np.ndarray.__new__(cls, *args, **kwargs)

def __array_finalize__(self, obj):

# self.resize(-1,3)
# self.reshape(-1,3)
# self=self.reshape(-1,3)
np.reshape(self,(-1,3))

a=np.array([1,2,3])
b=a.view(test)
c=test(a)
d=a.reshape(-1,3)
print '+++++++'
print a.shape,a
print '+++++++'
print b.shape,b
print '+++++++'
print c.shape,c
print '+++++++'
print d.shape,d

澄清我正在尝试做的事情:

我有矢量场,我想将其一般视为 3D,因此 (:,3) 形状和 (-1,3) 形状调整大小。我正在寻找一个纯粹的面向对象的解决方案来实现一些额外的方法来补充 NumPy 已经附带的方法。

例如,我已经开始写一些纯粹用 ndarrays 的东西,但如果我能写的话,代码会更具可读性

normalizedVector = ndarray.view(my3DVectorClass).normalize()

而不是

normalizedVector = ndarray / ( sum(ndarray**2, axis=1)**0.5 )

第二个问题:

  • 我希望不必担心我是否要求形状 (3,) 或 (:,3) 数组的规范化版本。
  • 我希望能够在类方法实现中使用纯线性代数术语,而不必费心在方法定义中进行索引和错误/维度检查

我猜你可能会争辩说只使用 my3DVectorClass 的实例,但是当使用所有 SciPy 机器时我将不得不进行反向 View 转换,因为如果我没记错的话他们期望 ndarray,这将使这些部分代码有点臃肿。

如果我的逻辑可能有问题,我很感激你的建议。我仍然在 OOP 和 SciPy/NumPy 的学习曲线上。

已经非常感谢了!

马库斯

最佳答案

您应该看看 matrix class 是如何实现的实现。它使用类似的技巧来维护 ndims=2 .

然而,我和许多其他人认为这种诡计带来的麻烦多于它的值(value)。 matrix类在过去引起了很多问题,因为它只是部分地表现得像一个正常的 ndarray .考虑改为编写函数。您上面给出的代码示例将是最具可读性的:normalizedVector = normalize(ndarray) .创建更多的子类并不总是最好的设计,即使在使用面向对象的风格时也是如此。

关于python - Numpy ndarray 子类 - 在 __array_finalize__ 中强制 reshape ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14966273/

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