あなたがゼロの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
が必要です。
他の方法でもシェイプを一致させることができます。 x
がnp.matrix
なく配列した場合、例えば、その列選択リストを(3,1)
In [814]: X= np.matrix(x)
In [816]: X[:,0] = M[:,0].toarray()
インデックスなり、x[:,[0]]
またはスライスはまた、2D列を生成します。
これは最近、数回にわたるアレイ/マトリックス互換性の問題と同じですが、スパース行列を使用するとひねりが加わります。
タイトルは、スパース行列の値を変更しようとしているように聞こえます。しかし、あなたの例では、スパース行列からの値を通常の配列に書き込もうとしています。 – hpaulj