Fusionar con múltiples matrices con diferentes dimensiones de columna

Para una tarea de aprendizaje automático, estoy buscando una manera de fusionar dos matrices de características, con diferentes dimensiones, para poder alimentarlas a un estimador. No puedo usar los métodos de fusión de scipy ya que estos requieren formas compatibles. Puedo usar los métodos de combinación de números, pero eso no funciona cuando realmente trato de dividir la matriz para la validación cruzada. El error se ve así:

Traceback (most recent call last): File "C:\Users\Ano\workspace\final_submission\src\linearSVM.py", line 50, in  result = ridge(train_text,train_labels,test_set,train_state,test_state) File "C:\Users\Ano\workspace\final_submission\src\Algorithms.py", line 90, in ridge x_train, x_test, y_train, y_test = cross_validation.train_test_split(train, labels, test_size = 0.2, random_state = 42) File "C:\Python27\lib\site-packages\sklearn\cross_validation.py", line 1394, in train_test_split arrays = check_arrays(*arrays, **options) File "C:\Python27\lib\site-packages\sklearn\utils\validation.py", line 211, in check_arrays % (size, n_samples)) ValueError: Found array with dim 77946. Expected 2 

La razón por la que se produce este error me la he encontrado en otro hilo de preguntas de stackoverflow: concatenar matrices dispersas en Python usando SciPy / Numpy . Aparentemente np.vstack / hstack crea dos objetos de matriz, lo que causó mi error.

Las formas con las que estoy tratando:

 (77946, 63677) (77946, 55) 

Básicamente, estoy buscando una manera de agregar esas 55 características adicionales por muestra de la segunda matriz a las características de la primera matriz.

También intenté crear una matriz numpy con las dimensiones adecuadas y simplemente rellenarla con las matrices de características, pero incluso crear esa matriz me dio un error de memoria. Intenté convertirlo en una matriz dispersa, pero eso tampoco funcionó. Tal vez estoy haciendo algo mal allí?

 new_matrix = sparse.csr_matrix(np.zeros((77946,63727))) new_matrix[:,0:63676] = big_feature_matrix new_matrix[:,63677:63727] = small_feature_matrix 

Actualización Así que probé la solución de Jaime pero me dio un error:

Código involucrado

 def feature_extraction(train,test,train_small,test_small): vectorizer = TfidfVectorizer(min_df = 3,strip_accents = "unicode",ngram_range = (1,2)) cv = CountVectorizer(strip_accents = "unicode",analyzer = "word",token_pattern = r'\w{1,}') print("fitting Vectorizer") vectorizer.fit(train) train_small = cv.fit_transform(train_state) test_small = cv.transform(test_state) print("transforming text") train = vectorizer.transform(train) test = vectorizer.transform(test) new_train = sparse.hstack((train, train_small), format='csr') new_test = sparse.hstack((test, test_small), format='csr') return new_train,new_test 

Traceback completo

 Traceback (most recent call last): File "C:\Users\Ano\workspace\final_submission\src\linearSVM.py", line 50, in  result = ridge(train_text,train_labels,test_set,train_small,test_small) File "C:\Users\Ano\workspace\final_submission\src\Algorithms.py", line 89, in ridge train,test = feature_extraction(train,test,train_small,test_small) File "C:\Users\Ano\workspace\final_submission\src\Preprocessing.py", line 109, in feature_extraction format='csr') File "C:\Python27\lib\site-packages\scipy\sparse\construct.py", line 423, in hstack return bmat([blocks], format=format, dtype=dtype) File "C:\Python27\lib\site-packages\scipy\sparse\construct.py", line 523, in bmat raise ValueError('blocks[%d,:] has incompatible row dimensions' % i) ValueError: blocks[0,:] has incompatible row dimensions 

Los conjuntos de trenes tienen las mismas dimensiones que antes. Los conjuntos de prueba tienen menos muestras (42157).

Actualizar

La solución de Jaime, realmente funcionó, simplemente me equivoqué cuando cargué los archivos, ¡gracias por toda su ayuda!

Puedes usar scipy.sparse.hstack :

 new_matrix = scipy.sparse.hstack((big_feature_matrix, small_feature_matrix), format='csr')