Я хочу объединить две csr_matrix, каждая с shape=(1,N)
.конкатенирующие scipy матрицы
Я знаю, что я должен использовать 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')
Последняя строка вызывает исключение -
File "C:\Anaconda\lib\site-packages\scipy\sparse\construct.py", line 484, in vstack
return bmat([[b] for b in blocks], format=format, dtype=dtype)File "C:\Anaconda\lib\site-packages\scipy\sparse\construct.py", line 533, in bmat
raise ValueError('blocks must be 2-D') ValueError: blocks must be 2-D
Я думаю, с помощью mean
есть что-то делать без. Любые идеи?
'prints [[-1. 0.]] [[1. 0.]] '- это не то, как печатаются разреженные матрицы. Это плотные. – hpaulj
@hpaulj Да, это было немного странно ... Я заметил, что в конце концов – omerbp
'mean' и' sum' выполняются 'dot' умножением с плотным массивом (из них) - и результат представляет собой плотную матрицу. Даже если в строке есть только одно ненулевое значение, эта сумма строк будет отличной от нуля. – hpaulj