如何替换稀疏Matrix Scipy中的列

时间:2017-05-21 11:56:20

标签: python matrix scipy sparse-matrix

我有一个具有相同2D维度的矩阵A和B. A - 是一个零矩阵,来自B我只想取第一列并用B.col [0]替换第一个A.col [0]。

我写

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

我试过这样的事情,但是没用了

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

我甚至尝试使用hstack,但我又得到了错误     “ValueError:块必须是2-D”,但它们是相同的2-D大小,我缺少什么? PLZ,帮帮我。

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

3 个答案:

答案 0 :(得分: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.]]

答案 1 :(得分:0)

你创建了一个2d numpy零数组,而不是矩阵或稀疏矩阵。

undefined method `back_url' for #<PaymentsController:0x007ff682c467a8>

这样的数组没有In [782]: x = np.zeros((3,2),int) In [783]: x.getcol(0) .... AttributeError: 'numpy.ndarray' object has no attribute 'getcol' 方法;这是由稀疏矩阵定义的东西。

您可以使用索引访问数组的列。结果是1d数组。如果要设置列,则需要提供兼容值,例如另一个1d数组或正确长度的列表。

getcol

稀疏矩阵确实有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

因为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) 是稀疏矩阵,它是2d,M也产生2d稀疏矩阵。即使转换为密集阵列,结果也是2d(3,1)。在此,它模仿getcol子类。

根据广播规则,(3,)与(3,1)不兼容。 ((1,3)兼容)。

np.matrix或flatten更正:

ravel

In [806]: x[:,0] = M.getcol(0).toarray().ravel() In [807]: x Out[807]: array([[1, 0], [0, 0], [2, 0]]) 实现了索引,所以这也有效:

csr

对于In [810]: x[:,0] = M[:,0].toarray().ravel() 格式,例如cooMo = M.tocoo()是必要的。

还有其他匹配形状的方法。例如,如果getcolx而不是数组,则其列选择为(3,1)

np.matrix

使用列表In [814]: X= np.matrix(x) In [816]: X[:,0] = M[:,0].toarray() 或切片进行索引也会生成第2列。

在某种程度上,这是最近出现过几次相同的阵列/矩阵兼容性问题,但稀疏矩阵的使用增加了扭曲。

答案 2 :(得分:0)

“ A”方法的简单教学示例

到这里来寻求答案,并想尝试以下方法。 我很高兴发现这种“数字直观方法”有效。

import numpy as np
import scipy.sparse as ss

m1 = np.array([[1, 4, 7], [2, 5, 8], [3, 6, 9]])
m2 = np.array([[11, 14, 17], [12, 15, 18], [13, 16, 19]])

print(m1, '\n')
print(m2, '\n')

m1 = ss.csc_matrix(m1)
m2 = ss.csc_matrix(m2)

m1 = ss.hstack([m1[:, 0], m2[:, 1], m1[:, 2]])

print(m1.todense())

输出:

[[1 4 7]
 [2 5 8]
 [3 6 9]]

[[11 14 17]
 [12 15 18]
 [13 16 19]]

[[ 1 14  7]
 [ 2 15  8]
 [ 3 16  9]]