2016-07-21 2 views
1

У меня есть следующие матрицы:Как column_stack массив numpy с scipy разреженной матрицей?

A.toarray() 

array([[0, 0, 0, ..., 0, 0, 0], 
     [0, 0, 0, ..., 0, 0, 0], 
     [0, 0, 0, ..., 0, 0, 0], 
     ..., 
     [0, 0, 0, ..., 0, 0, 0], 
     [0, 0, 0, ..., 0, 0, 0], 
     [0, 0, 0, ..., 0, 0, 0]], dtype=int64) 

type(A) 

scipy.sparse.csr.csr_matrix 

A.shape 
(878049, 942) 

И матрица B:

B 

array([2248, 2248, 2248, ..., 0, 0, 0]) 

type(B) 

numpy.ndarray 

B.shape 

(878049,) 

Я хотел бы столбец стека A и B в C, я попробовал на следующие:

C = sparse.column_stack([A,B]) 

Затем:

/usr/local/lib/python3.5/site-packages/numpy/lib/shape_base.py in column_stack(tup) 
    315    arr = array(arr, copy=False, subok=True, ndmin=2).T 
    316   arrays.append(arr) 
--> 317  return _nx.concatenate(arrays, 1) 
    318 
    319 def dstack(tup): 

ValueError: all the input array dimensions except for the concatenation axis must match exactly 

Моя проблема в том, как сохранить размеры. Таким образом, любая идея о том, как столбцы стекают их ?.

Update

Я попробовал следующее:

#Sorry for the name 
C = np.vstack((A.A.T, B)).T 

и я получил:

array([[ 0, 0, 0, ..., 0, 6], 
     [ 0, 0, 0, ..., 0, 6], 
     [ 0, 0, 0, ..., 0, 6], 
     ..., 
     [ 0, 0, 0, ..., 0, 1], 
     [ 0, 0, 0, ..., 0, 1], 
     [ 0, 0, 0, ..., 0, 1]], dtype=int64) 

Это правильный путь к колонке складывают их ?.

+1

Где вы нашли 'sparse.column_stack'? Там 'np.column_stack', но не разреженная версия. – hpaulj

+0

Все нижеприведенные ответы идут нескромно. Проверьте этот ответ http://stackoverflow.com/a/33259578/2988730. Это похоже на то, что вы искали. Я голосую, чтобы закрыть, как обманывать. –

+0

Возможный дубликат [Есть эффективный способ конкатенации матриц scipy.sparse?] (Http://stackoverflow.com/questions/6844998/is-there-an-efficient-way-of-concatenating-scipy-sparse-matrices) –

ответ

1

Вы попробовали следующее?

C=np.vstack((A.T,B)).T 

С образцами значений:

A = array([[1, 2, 3], [4, 5, 6]]) 
>>>> A.shape 
(2, 3) 
B = array([7, 8]) 
>>> B.shape 
(2,) 
C=np.vstack((A.T,B)).T 
>>> C.shape 
(2, 4) 

Если А разреженная матрица, и вы хотите, чтобы поддерживать выход как разреженный, вы могли бы сделать:

C=np.vstack((A.A.T,B)).T 
D=csr_matrix((C)) 
+0

Я пробовал это, однако я получаю: 'ValueError: все размеры входного массива, кроме оси конкатенации, должны точно соответствовать –

+0

. Также' A' - разреженная матрица. –

+0

Я обновил, спасибо –

2

2 выпуска

  • нет sparse.column_stack
  • вы смешиваете разреженную матрицу и плотный массив

2 небольших примеров:

In [129]: A=sparse.csr_matrix([[1,0,0],[0,1,0]]) 
In [130]: B=np.array([1,2]) 

Использование np.column_stack дает свою ошибку:

In [131]: np.column_stack((A,B)) 
... 
ValueError: all the input array dimensions except for the concatenation axis must match exactly 

Но если я первый превратить A в array, column_stack делает нормально:

In [132]: np.column_stack((A.A, B)) 
Out[132]: 
array([[1, 0, 0, 1], 
     [0, 1, 0, 2]]) 

эквивалент с concatenate:

In [133]: np.concatenate((A.A, B[:,None]), axis=1) 
Out[133]: 
array([[1, 0, 0, 1], 
     [0, 1, 0, 2]]) 

есть sparse.hstack. Для этого мне нужно включить B в разреженную матрицу.Transpose работает, потому что теперь это матрица (в отличие от массива 1d):

In [134]: sparse.hstack((A,sparse.csr_matrix(B).T)) 
Out[134]: 
<2x4 sparse matrix of type '<class 'numpy.int32'>' 
    with 4 stored elements in COOrdinate format> 
In [135]: _.A 
Out[135]: 
array([[1, 0, 0, 1], 
     [0, 1, 0, 2]], dtype=int32)