【问题标题】:concatenating scipy matrices连接 scipy 矩阵
【发布时间】:2015-09-13 07:50:39
【问题描述】:

我想连接两个 csr_matrix,每个都有shape=(1,N)

我知道我应该使用scipy.sparse.vstack

from scipy.sparse import csr_matrix,vstack
c1 = csr_matrix([[1, 2]])

c2 = csr_matrix([[3, 4]])

print c1.shape,c2.shape
print vstack([c1, c2], format='csr')

#prints:
(1, 2) (1, 2)
  (0, 0)    1
  (0, 1)    2
  (1, 0)    3
  (1, 1)    4

但是,我的代码失败了:

from scipy.sparse import csr_matrix,vstack
import numpy as np
y_train = np.array([1, 0, 1, 0, 1, 0])
X_train = csr_matrix([[1, 1], [-1, 1], [1, 0], [-1, 0], [1, -1], [-1, -1]])

c0 = X_train[y_train == 0].mean(axis=0)
c1 = X_train[y_train == 1].mean(axis=0)

print c0.shape, c1.shape #prints (1L, 2L) (1L, 2L)
print c0,c1 #prints [[-1.  0.]] [[ 1.  0.]]
print vstack([c0,c1], format='csr')

最后一行引发异常 -

文件“C:\Anaconda\lib\site-packages\scipy\sparse\construct.py”,第 484 行,在 vstack
return bmat([[b] for b in blocks], format=format, dtype=dtype)

文件“C:\Anaconda\lib\site-packages\scipy\sparse\construct.py”,第 533 行,在 bmat
raise ValueError('blocks must be 2-D') ValueError:块必须是二维的

我猜想使用 mean 与 out 有关。 有什么想法吗?

【问题讨论】:

  • prints [[-1. 0.]] [[ 1. 0.]] - 这不是打印稀疏矩阵的方式。那些很密集。
  • @hpaulj 是的,这有点奇怪......我终于注意到了
  • meansumdot 与密集数组(一个)相乘 - 结果是密集矩阵。即使一行中只有一个非零值,该行总和也将非零。

标签: python numpy scipy


【解决方案1】:

取稀疏矩阵的平均值会返回一个 NumPy 矩阵(它不是稀疏的)。 所以c0c1 是矩阵:

In [76]: type(c0)
Out[76]: numpy.matrixlib.defmatrix.matrix

In [89]: sparse.issparse(c0)
Out[94]: False

vstack 期望它的第一个参数是一个稀疏矩阵序列。 所以(至少)使第一个矩阵成为稀疏矩阵:

In [31]: vstack([coo_matrix(c0), c1])
Out[31]: 
<2x2 sparse matrix of type '<type 'numpy.float64'>'
    with 2 stored elements in COOrdinate format>

In [32]: vstack([coo_matrix(c0), c1]).todense()
Out[32]: 
matrix([[-1.,  0.],
        [ 1.,  0.]])

【讨论】:

    猜你喜欢
    • 2018-03-18
    • 1970-01-01
    • 2013-11-11
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多