2016-04-15 8 views
1

行列VxKのすべての値を、稠密行列の一部である列Vx1のすべての値のべき乗で求めようとしていますVxN。したがって、ベータの各値は、列内の対応する行の累乗にする必要があります。これは、ベータ版のすべてのK列に対して実行する必要があります。私が使用してベータ版のための練習numpyのアレイ用のpythonにnp.power使用する場合:行列を稠密行列の列のパワーにPythonでnumpyを使用

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

を私は私が望む結果を得ることができています。ベータの場合は(3,10)、head_matrix [:、0]の場合は(10、)です。この場合、3 = K、10 = Vです。

Iは、データ、行、およびCOLが配列され

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

を用いて得られた私の実際の行列、でこれを行う場合は、私は同様の操作を行うことができません:

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

ここで、寸法はベータの場合(10,30784)、この場合は10 = K、30784 = Vの場合は(30784,1)です。私は、違いが行列の行列(長さ、1)とhead_matrixは実際に私が作成したnumpyの配列(長さ)であることをあるようだ次のエラー

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) ` 

を取得します。どのようにして、この同じ操作を高密度マトリックスの列で行うことができますか?

答えて

0

アレイ上でsqueezeメソッドを使用すると、この余分なディメンションを取り除くことができます。 だから np.power(beta.T, matrix[:,0].squeeze())はすべきことです。

+1

M[:,0].A1は(N)しばらく前から配列

を生成します'ravel'のように'(1、N) 'になります。 – hpaulj

1

問題の場合は、(10,30784)(30784,1)をブロードキャストできません。あなたが(10,N)(N,)と共に使用したときに動作することに注意してください。これは、(N,)(1,N)に、そして(10,N)に展開できるからです。

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

のでM(:,0)(N,1)で、常に2Dでnp.matrixあります。いくつかのsolutonsがあります。

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

アレイに疎行列を変換:

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

M[:,0].squeeze()M[:,0].ravel()両方が(1,N)行列を生成します。 M[:,0].reshape(-1)もそうです。その2次元の品質は、matrixを返す限り、永続的です。 `` np.matrix` squeeze`は、余分な次元を取り除くしないと、それだけで変更する技術的Numpy matrix to array

+0

あなたの修正 'np.power(beta、M [:、0])'は同じ結果を返しますか? 'beta.T'の代わりに' beta'の修正を補うために 'np.power(beta、M [:、0])。T 'ではないでしょうか? – rocksportrocker

+0

はい、正確に一致するためには 'T'の後に。 – hpaulj

関連する問題