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)
我的第二个问题:
我想你可以争论只使用my3DVectorClass的实例,但是当我使用所有SciPy机器时我必须进行反向视图转换,因为如果我没有弄错的话,他们会期待ndarray,这会使这些部分成为代码有点臃肿.
如果我的逻辑错误,我会感激你的建议.我仍然非常关注OOP和SciPy/NumPy的学习曲线.
非常感谢!
马库斯