2017-07-18 13 views
2

行列Aの特異値分解を使用します。転置numpy配列の初期化

可能ならば私が書くでしょう:

V, S, W.T = np.linalg.svd(A) 

しかし、私は転置その持つ配列を初期化することはできません。 は今、私は2つの質問がある:

  1. は、私の知る限りは、Pythonの内部を理解するように、この問題に対する明確な回避策はありません。 Wの属性/メソッドの呼び出しでは、インスタンスを初期化する必要があるためです。 @property属性のようなものがコンストラクタとして必要です。

  2. 明白な回避策がない場合は、次のいずれかのオプションが優れている/より慣れています。

オプション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

おそらく2つのオプションをタイムアウトさせることができます。 – Gribouillis

答えて

3

オプション2は、私の実験では50%以上の時間がかかります。それはまた、読むのが難しいです。

オプション1は良いですが、Wは配列tmpのビューになります。これは、tmp[0,0] = 0(これはWも変更されます)のように、何かを行わない限り問題にはなりません。

私はtmpでバージョンと同じ時間に実行されます(そしてそれはまだビューWなります)が、同じデータにアクセスすることが可能な別の名前を作成しません

W = np.linalg.svd(A) 
W = W.T 

となるだろう。