我遇到以下问题:
我想为这个子类的任何新实例编写一个 ndarray 子类并强制执行形状(-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
为了澄清我想要做的事情:
我有我想将其一般视为 3D 的矢量场,因此 (:,3) 形状和 (-1,3) 形状调整大小。我正在寻找一个纯粹的面向对象的解决方案来实现一些额外的方法来补充 NumPy 已经提供的功能。
例如,我已经开始纯粹用 ndarrays 写一些东西,但是如果我可以写的话,代码会更易读
normalizedVector = ndarray.view(my3DVectorClass).normalize()
而不是
normalizedVector = ndarray / ( sum(ndarray**2, axis=1)**0.5 )
我的第二个问题:
- 我希望不必担心我是否要求形状 (3,) 或 (:,3) 数组的规范化版本。
- 我希望能够在类方法实现中使用纯线性代数术语,而不必为方法定义中的索引和错误/尺寸检查而烦恼
我想您可能会争辩说只使用 my3DVectorClass 的实例,但是在使用所有 SciPy 机器时我必须进行反向视图转换,因为如果我没记错的话,他们期望 ndarray,这将使这些部分成为代码有点臃肿。
如果我的逻辑可能以某种方式出错,我将感谢您的建议。我仍然非常了解 OOP 和 SciPy/NumPy。
已经非常感谢了!
马库斯