【问题标题】:scipy append all rows of one sparse matrix to anotherscipy 将一个稀疏矩阵的所有行附加到另一个
【发布时间】:2016-05-31 21:35:49
【问题描述】:

我有一个 numpy 矩阵,想在上面附加另一个矩阵。

这两个矩阵有以下形状:

m1.shape = (2777, 5902)  m2.shape = (695, 5902)

我想将 m2 附加到 m1 以便新矩阵具有形状:

m_new.shape = (3472, 5902)

当我使用 numpy.append 或 numpy.concatenate 时,我只会得到一个新数组,其中包含两个矩阵和形状 (2,1)。

你们中的任何人都知道如何从两个矩阵中得到一个大矩阵?

附加信息:两者都是稀疏矩阵。

编辑: m1看起来像

(0, 1660)   0.444122811195
(0, 3562)   0.260868771714
(0, 4743)   0.288149437574
(0, 4985)   0.514889706991
(0, 5215)   0.272163636657
(0, 5721)   0.559006134727
(1, 555)    0.0992498400527
(1, 770)    0.133145289523
(1, 790)    0.0939044698233
(1, 1097)   0.259867567986
(1, 1285)   0.188836288168
(1, 1366)   0.24707459927
(1, 1499)   0.237997843516
(1, 1559)   0.120069347224
(1, 1701)   0.17660176488
(1, 1926)   0.185678520634
(1, 2177)   0.163066377369
(1, 2641)   0.079958199952
(1, 2937)   0.259867567986
(1, 3551)   0.198471489351
(1, 3562)   0.0926197593026
(1, 3593)   0.100537828805
(1, 4122)   0.198471489351
(1, 4538)   0.57162654484
(1, 4827)   0.105808609537

m2 看起来像:

(0, 327)    0.0770581299315
  (0, 966)  0.309858753157
  (0, 1231) 0.286870892505
  (0, 1384) 0.281385698712
  (0, 1817) 0.204495931592
  (0, 2284) 0.182420951496
  (0, 2414) 0.114591086901
  (0, 2490) 0.261442040482
  (0, 3122) 0.321676138471
  (0, 3151) 0.286870892505
  (0, 4031) 0.172251612658
  (0, 5149) 0.25839783806
  (0, 5215) 0.125806303262
  (0, 5225) 0.336280781816
  (0, 5231) 0.135930403721
  (0, 5294) 0.145049459537
  (0, 5794) 0.20145172917
  (0, 5821) 0.224439589822
  (1, 327)  0.191031948626
  (1, 1171) 0.62081265022

矩阵的类型是:

<class 'scipy.sparse.csr.csr_matrix'> <class 'scipy.sparse.csr.csr_matrix'>

已解决:

m_new = scipy.sparse.vstack((m1, m2))

成功了

感谢您的帮助。

【问题讨论】:

  • 你应该从一开始就告诉我们这些是scipy sparse - 并相应地标记了问题。
  • 对不起,如果有人正在寻找该问题,我相应地编辑了问题

标签: python matrix scipy sparse-matrix


【解决方案1】:

您可以在您的情况下使用 numpy.vstack(或 numpy.hstack,当矩阵形状为 (x,y) 和 (x,z) 时)

例子:

a = np.zeros((3,7))
b = np.zeros((46,7))
c = np.vstack((a,b))
print c.shape
#(49,7)

【讨论】:

  • 如果我这样做,我会得到以下结果:[[ &lt;2777x5902 sparse matrix of type '&lt;class 'numpy.float64'&gt;' with 54003 stored elements in Compressed Sparse Row format&gt;] [ &lt;695x5902 sparse matrix of type '&lt;class 'numpy.float64'&gt;' with 12226 stored elements in Compressed Sparse Row format&gt;]] 这不是我想要的,因为这是一个新数组,里面有两个矩阵,但我想要一个矩阵作为结果。
  • 在使用 scipy.sparse.vstack 而不是 numpy vstack 时有效
【解决方案2】:

您可以使用concatenate (http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.concatenate.html):

m_new = np.concatenate((m1, m2))

例如,

a = np.zeros((5, 3))
b = np.zeros((4, 3))
print np.concatenate((a, b)).shape
# (9, 3)

如果您使用矩阵而不是数组,这仍然有效:

print np.concatenate((np.matrix(a), np.matrix(b))).shape
# (9, 3)

【讨论】:

  • 当我这样做时,我得到以下 ValueError ValueError: zero-dimensional arrays cannot be concatenated
  • @d.a.d.a 然后,您的阵列之一似乎没有您提到的形状
  • @d.a.d.a 你确定你把这两个数组/矩阵放入一个元组np.concatenate((m1, m2)) 吗?注意双括号。
  • 是的,我的代码是cross_val_matrix = np.concatenate((train_matrix, test_matrix)),训练矩阵和测试矩阵的形状就像问题中提到的 m1 和 m2
  • @d.a.d.a 奇怪...如果您复制/粘贴我写下的示例(a = np.zeros((5, 3)); ... 是否有效?如果您执行print type(train_matrix), type(test_matrix),您会看到什么?
猜你喜欢
  • 1970-01-01
  • 2018-11-05
  • 2023-04-05
  • 2021-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-13
  • 2017-03-26
相关资源
最近更新 更多