2016-04-15 27 views
1

Ich versuche, alle Werte in einer Matrix Beta VxK um die Macht aller Werte in einer Spalte Vx1 zu erhalten, die Teil einer dichten Matrix ist VxN. Also sollte jeder Wert in der Beta die Stärke der entsprechenden Zeile in der Spalte haben, und dies sollte für alle K Spalten in der Beta getan werden. Wenn ich auf Python verwenden np.power für eine Praxis numpy Array für Beta mit:Matrix auf die Macht einer Spalte einer dichten Matrix mit numpy in Python

np.power(head_beta.T, head_matrix[:,0]) 

Ich bin in der Lage, die Ergebnisse Ich möchte zu erhalten. Die Dimensionen sind (3, 10) für beta und (10,) für head_matrix [:, 0], wobei in diesem Fall 3 = K und 10 = V ist.

Allerdings, wenn ich diese auf meinem tatsächlichen Matrix, die durch die Verwendung

matrix=csc_matrix((data,(row,col)), shape=(30784,72407)).todense() 

wo Daten, Zeile und Spalte sind Arrays erhalten wurde, kann ich nicht die gleiche Operation tun:

np.power(beta.T, matrix[:,0]) 

wobei die Dimensionen (10, 30784) für Beta und (30784, 1) für Matrix sind, in diesem Fall 10 = K und 30784 = V. I die folgenden Fehler

ValueError        Traceback (most recent call last) 
<ipython-input-29-9f55d4cb9c63> in <module>() 
----> 1 np.power(beta.T, matrix[:,0]) 

ValueError: operands could not be broadcast together with shapes (10,30784) (30784,1) ` 

Es scheint, daß der Unterschied ist, daß ein Matrix-Matrix ist (Länge, 1) und ist eigentlich eine head_matrix numpy array (Länge), die ich erstellt. Wie kann ich dieselbe Operation mit der Spalte einer dichten Matrix durchführen?

Antwort

0

Sie können die squeeze-Methode für Arrays verwenden, um diese zusätzliche Dimension zu entfernen. So np.power(beta.T, matrix[:,0].squeeze()) sollte den Trick tun.

+1

Technisch mit einem '' np.matrix' squeeze' nicht der zusätzliche Dimension zu befreien bekommt, es ändert sich nur die Form zu '(1, N)', wie 'ravel'. – hpaulj

1

Im Problemfall kann es (10,30784) und (30784,1) nicht senden. Wie Sie bemerken, funktioniert es, wenn (10,N) mit (N,) verwendet wird. Das ist, weil es die (N,) zu (1,N) und weiter zu (10,N) erweitern kann.

M = sparse.csr_matrix(...).todense() 

ist np.matrix die immer 2d ist, so M(:,0)(N,1) ist. Es gibt mehrere Lösungen.

np.power(beta.T, M[:,0].T) # change to a (1,N) 
np.power(beta, M[:,0])  # line up the expandable dimensions 

wandeln die Sparse-Matrix mit einem Array:

A = sparse.....toarray() 
np.power(beta.T, A[:,0]) 

M[:,0].squeeze() und M[:,0].ravel() sowohl eine (1,N) Matrix erzeugen. So auch . Diese 2d-Qualität ist beständig, solange sie matrix zurückgibt.

M[:,0].A1 erzeugt eine (N,) Array

Von einer Weile zurück: Numpy matrix to array

+0

Ergibt Ihre Korrektur 'np.power (Beta, M [:, 0])' das gleiche Ergebnis? Sollte es nicht 'np.power (beta, M [:, 0]). T' sein, um die Modifikation 'beta' anstelle von' beta.T' zu kompensieren? – rocksportrocker

+0

Ja, 'T' nach genau übereinstimmen. – hpaulj

Verwandte Themen