2017-05-21 16 views
0

マトリックス2と同じ次元の行列AとBを持っています A - ゼロの行列で、BIの最初の列を取り、最初のA.col [0] B.col [0]による。スパース行列の列を置き換える方法

私はそのようななめらかを試してみましたが、それは私もhstack使用しようとしたが、再び、私はエラー 「とValueErrorを取得

data_sims.getcol(0).toarray = data.getcol(0).toarray() 

無用だ

data_sims = np.zeros((data.shape[0],data.shape[1])) 
data_sims = sparse.csr_matrix(data_sims).tocoo() 

を書く:ブロックは、2-Dでなければなりません"彼らは同じ2-Dサイズですが、私は何が欠けていますか? plz、助けてください。

data_sims = hstack(data.getcol(0).toarray(),data_sims) 
+0

タイトルは、スパース行列の値を変更しようとしているように聞こえます。しかし、あなたの例では、スパース行列からの値を通常の配列に書き込もうとしています。 – hpaulj

答えて

0

あなたが列に列を割り当てることができます。

from scipy import sparse 
import numpy as np 

# Target matrix 
A = np.zeros((2, 2)) 

# Some sparse matrix 
B = sparse.csr_matrix([[5, 6], [7, 8]]).tocoo() 

# Assign the first column from B into A 
A[:, 0] = B.tocsc()[:, 0].todense().ravel() 

これは、印刷:

[[ 5. 0.] 
[ 7. 0.]] 
0

あなたがゼロの2D numpyの配列ではなく、マトリックスまたはスパース行列を作成しました。このようなアレイはgetcol方法を持っていない

In [782]: x = np.zeros((3,2),int) 
In [783]: x.getcol(0) 
.... 
AttributeError: 'numpy.ndarray' object has no attribute 'getcol' 

。それは疎な行列を定義するものです。

インデックスの付いた配列の列にアクセスします。結果は1次元配列です。列を設定する場合は、別の1次元配列や正しい長さのリストなど、互換性のある値を指定する必要があります。

In [801]: M = sparse.csr_matrix([[1,0],[0,2],[2,0]]) 
In [802]: M 
Out[802]: 
<3x2 sparse matrix of type '<class 'numpy.int32'>' 
    with 3 stored elements in Compressed Sparse Row format> 
In [803]: M.getcol(0) 
Out[803]: 
<3x1 sparse matrix of type '<class 'numpy.int32'>' 
    with 2 stored elements in Compressed Sparse Row format> 
In [804]: M.getcol(0).toarray() 
Out[804]: 
array([[1], 
     [0], 
     [2]], dtype=int32) 
In [805]: x[:,0] = M.getcol(0).toarray() 
.... 
ValueError: could not broadcast input array from shape (3,1) into shape (3) 

Mがスパース行列であるので、それは2Dであり、そしてgetcolも2Dスパース行列を生成する:

In [784]: x[:,0] 
Out[784]: array([0, 0, 0]) 
In [785]: x[:,0] = [1,2,3] 
In [786]: x 
Out[786]: 
array([[1, 0], 
     [2, 0], 
     [3, 0]]) 

疎行列はgetcolを持っています。密な配列に変換された場合でも、結果は2d(3,1)です。この場合、サブクラスnp.matrixを模倣します。

ブロードキャストのルールでは、(3)は(3,1)と互換性がありません。 ((1,3)と互換性があります)。

ravel又は平坦化することを補正する:

In [806]: x[:,0] = M.getcol(0).toarray().ravel() 
In [807]: x 
Out[807]: 
array([[1, 0], 
     [0, 0], 
     [2, 0]]) 

csrがインデキシングを実現するので、これも動作:coo形式について

In [810]: x[:,0] = M[:,0].toarray().ravel() 

を、例えばMo = M.tocoo()getcolが必要です。

他の方法でもシェイプを一致させることができます。 xnp.matrixなく配列した場合、例えば、その列選択リストを(3,1)

In [814]: X= np.matrix(x) 
In [816]: X[:,0] = M[:,0].toarray() 

インデックスなり、x[:,[0]]またはスライスはまた、2D列を生成します。

これは最近、数回にわたるアレイ/マトリックス互換性の問題と同じですが、スパース行列を使用するとひねりが加わります。

関連する問題