Numpy ndarray子类 - 强制重塑__array_finalize__

Mar*_*kus 2 python numpy subclass multidimensional-array

我遇到以下问题:

我想编写一个ndarray子类,并为该子类的任何新实例强制执行shape(-1,3),无论它出现在哪种方式 - 显式构造函数,视图转换或模板.

我尝试过很多东西,但似乎都没有用.我估计我还没有完全掌握基础过程.任何帮助深表感谢!

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
Run Code Online (Sandbox Code Playgroud)

澄清我想要做的事情:

我有矢量字段,我想将其一般地视为3D,因此(:,3)形状和(-1,3)形状调整大小.我正在寻找一个纯粹的面向对象的解决方案来实现基本上一些额外的方法来补充NumPy已经提供的内容.

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

normalizedVector = ndarray.view(my3DVectorClass).normalize()
Run Code Online (Sandbox Code Playgroud)

而不是

normalizedVector = ndarray / ( sum(ndarray**2, axis=1)**0.5 )
Run Code Online (Sandbox Code Playgroud)

我的第二个问题:

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

我想你可以争论只使用my3DVectorClass的实例,但是当我使用所有SciPy机器时我必须进行反向视图转换,因为如果我没有弄错的话,他们会期待ndarray,这会使这些部分成为代码有点臃肿.

如果我的逻辑错误,我会感激你的建议.我仍然非常关注OOP和SciPy/NumPy的学习曲线.

非常感谢!

马库斯

Rob*_*ern 7

您应该看一下如何实现matrix类.它做了类似的技巧来维护ndims=2.

但是,我和其他许多人认为这样的伎俩比它的价值更麻烦.这个matrix课程在过去引起了很多问题,因为它只是部分行为像普通人一样ndarray.考虑改写函数.您在上面给出的代码示例将是最可读的,如下所示:normalizedVector = normalize(ndarray).即使使用面向对象的样式,创建更多子类并不总是最佳设计.