2017-12-01 7 views
1

numpy.ndarray을 합하면 keepdims=True을 설정하지 않으면 배열의 차원이 감소합니다. 그러나,이 Scipy의 스파 스 매트릭스에 대한 진실하지 않는 것 : 예제의 마지막 줄에서와 같이왜 희소 행렬의 합계가 빈 차원을 유지합니까?

import scipy.sparse 

matrix = scipy.sparse.coo_matrix([[0, 1], [2, 1]]) 
print(matrix.shape)     # (2, 2) as expected. 
print(matrix.sum().shape)   #() as expected. 
print(matrix.sum(axis=0).shape)  # (1, 2) but expected (2,). 
print(matrix.sum(axis=0)[0].shape) # (1, 2) but expected (2,). 

은, 난 결과 벡터를 선택할 수 없습니다. 또한, 고밀도 NumPy와 배열에 합의 결과를 캐스팅하려고하는 것은 실패

matrix.toarray()    # This works. 
matrix.sum(axis=0).toarray() # AttributeError: 'matrix' has no 'toarray'. 

가 어떻게 하나 개의 차원을 따라 희소 행렬의 합을 계산하고 조밀 한 배열로 결과를 얻을 수 있습니까?

+1

나는 생각한다 이것은 "행렬"이고 배열이 아니기 때문입니다. 그러므로 당신은 두 가지 차원을 가져야합니다. –

+0

@PaulH 원래의 행렬을 Numpy 배열로 캐스팅 할 수 있지만 합계에서 반환 된 객체는 왜 캐스팅하지 못합니까? – danijar

+1

스파 스 행렬 대 numpy.matrix? –

답변

2

뚜렷한 클래스 (형식에 따른 클래스)는 np.matrix (이전에는 구식 MATLAB 행렬처럼 동작 함)과 비슷하게 동작합니다. 모양은 항상 2d이고 인덱싱, 합계 및 관련 액션은 2d를 반환합니다.

In [177]: M.sum(axis=0) 
Out[177]: matrix([[2, 2]], dtype=int32) 
In [178]: _.shape 
Out[178]: (1, 2) 
In [179]: M.sum(axis=1) 
Out[179]: 
matrix([[1], 
     [3]]) 
In [180]: _.shape 
Out[180]: (2, 1) 

이것은 당신이 얻을 같은 동작입니다 :

In [174]: M.sum() 
Out[174]: 4 
In [175]: _.shape 
Out[175]:() 
In [176]: type(__) 
Out[176]: numpy.int32 

축 합계가 2 차원 열 또는 행 벡터 고밀도 매트릭스를 생성합니다

In [172]: M = sparse.csr_matrix([[0,1],[2,1]]) 
In [173]: M 
Out[173]: 
<2x2 sparse matrix of type '<class 'numpy.int32'>' 
    with 3 stored elements in Compressed Sparse Row format> 

총 합계는 스칼라, 또는 0D 배열을 생성 조밀 한 모체에서, 예를 들면. M.todense(). keepdims=True은 배열 (MATLAB에서 오는 사람들은 sum 치수를 줄이는 것에 대해 불평하는 사람들)에 이와 같은 것을 제공합니다.

조밀 행렬은 1 차원 배열로 변환하는 편리한 .A1 속성을 가진다 : 희소 행렬 및 밀도 행렬 모두

In [181]: M.sum(axis=1).A1 
Out[181]: array([1, 3]) 
In [182]: M.sum(axis=0).A1 
Out[182]: array([2, 2], dtype=int32) 

.A 작동 있지만 희소 toarray 방법 (및 todense)을 갖는다. 내가 말했듯이, 스파 스는 조밀 한 행렬을 모방하지만 서브 클래스는 아닙니다.

스파 스 축 합계는 실제로 행렬 곱셈을 수행합니다. 희소 행렬은 조밀 한 매트릭스 생산 * 고밀도 매트릭스 :

In [186]: M*np.matrix([[1],[1]]) 
Out[186]: 
matrix([[1], 
     [3]], dtype=int32) 
In [187]: np.matrix([[1,1]])*M 
Out[187]: matrix([[2, 2]], dtype=int32) 

배열의 합이 '빈'떠나지 않을 대한 불만 (단수는 용어, 1 0이 아닌) 차원 :

Why does the shape remains same when I sum a square numpy array along either directions?