2017-07-18 1 views
2

Je souhaite utiliser la décomposition de la valeur singulière de la matrice A.Initialize transposed numpy array

Si possible, je voudrais écrire:

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

Mais je ne peux pas initialiser un tableau avec sa transposée. Maintenant, j'ai deux questions:

  1. Pour autant que je comprends les entrailles de python, il n'y a aucune solution évidente à ce problème. Parce que l'appel d'un attribut/méthode de W nécessite l'initialisation de l'instance. Il faudrait quelque chose en tant que constructeur en tant qu'attribut @property.

  2. S'il n'y a pas de solution de contournement évidente, laquelle des options suivantes est meilleure/plus idiomatique?

Option 1:

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

Option 2:

V, S, W = np.empty(...), np.empty(...), np.empty(...) 
V[:, :], S[:, :], W.T[:, :] = np.linalg.svd(A) 
+0

Vous pourriez peut-être chronométrer les deux options. – Gribouillis

Répondre

3

Option 2 prend plus de 50% plus de temps dans mon expérience. C'est aussi plus difficile à lire. L'option 1 est bonne, mais remarquez que W sera une vue du tableau tmp. Cela ne devrait pas être un problème, sauf si vous faites quelque chose qui en fait un, comme tmp[0,0] = 0 (qui modifie aussi W).

Je voudrais aller avec

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

qui fonctionne en même temps que la version avec tmp (et il fait encore W une vue), mais ne crée pas un autre nom par lequel on peut accéder aux mêmes données.