我想使用矩阵A
的奇异值分解。
如果可能,我会写:
V, S, W.T = np.linalg.svd(A)
但我不能用它的转置来初始化数组。 现在我有两个问题:
据我了解python内部结构,此问题没有明显的解决方法。因为调用W
的属性/方法需要初始化实例。
作为@property
属性的构造函数,需要一些东西。
如果没有明显的解决方法,以下哪个选项更好/更具惯用性。
选项1:
V, S, tmp = np.linalg.svd(A)
W = tmp.T
选项2:
V, S, W = np.empty(...), np.empty(...), np.empty(...)
V[:, :], S[:, :], W.T[:, :] = np.linalg.svd(A)
答案 0 :(得分:3)
选项2在我的实验中花费的时间超过50%。它也更难阅读。
选项1很好,但请注意W
将是数组tmp
的视图。这应该不是问题,除非你做了一件事,比如tmp[0,0] = 0
(它也会修改W
)。
我会选择
W = np.linalg.svd(A)
W = W.T
与tmp
版本同时运行(它仍然使W成为视图),但不会创建另一个可以访问相同数据的名称。