我有一个具有相同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)
答案 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()
格式,例如coo
,Mo = M.tocoo()
是必要的。
还有其他匹配形状的方法。例如,如果getcol
是x
而不是数组,则其列选择为(3,1)
np.matrix
使用列表In [814]: X= np.matrix(x)
In [816]: X[:,0] = M[:,0].toarray()
或切片进行索引也会生成第2列。
在某种程度上,这是最近出现过几次相同的阵列/矩阵兼容性问题,但稀疏矩阵的使用增加了扭曲。
答案 2 :(得分:0)
到这里来寻求答案,并想尝试以下方法。 我很高兴发现这种“数字直观方法”有效。
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]]