2014-04-27 2 views
2

numpy의 einsum 기능이 scipy.sparse 행렬에서 작동하지 않는 것 같습니다. einsum이 희소 행렬로 할 수있는 일을하는 대안이 있습니까?희소 행렬에 einsum

@ eickenberg의 대답에 대한 응답으로 : 내가 원하는 특정 전자는 numpy.einsum("ki,kj->ij",A,A) - 행의 바깥 쪽 제품의 합계입니다.

+1

예, 대안이 있습니다,하지만 일반적으로 "스파 스 einsum"는 없다 :

스파 스 csr_matrix.dot이다. 그것은 당신이해야 할 일에 달려 있습니다. –

답변

2

행렬의 제한은 선형 연산자를 나타내므로 2 차원으로 유지되므로 어떤 작업을 수행하려고합니까?

2D 매트릭스 쌍 einsum 모든 조작은 dot, transpose 점별 및 연산을 이용하지 않고 물품 einsum 매우 쉬운 결과를 2 차원을 초과하지 아니하여야한다.

이렇게 많은 수의 희소 매트릭스에 대해 특정 작업이 필요한 경우 einsum없이 작성할 수 있습니다.

업데이트 : np.einsum("ki, kj -> ij", A, A)을 구현하는 특정 방법은 A.T.dot(A)입니다. 자신을 설득하기 위해 다음 예제를 시도하십시오.

import numpy as np 
rng = np.random.RandomState(42) 
a = rng.randn(3, 3) 
b = rng.randn(3, 3) 
the_einsum_ab = np.einsum("ki, kj -> ij", a, b) 
the_a_transpose_times_b = a.T.dot(b) 
# We write a test in order to assert equality 
from numpy.testing import assert_array_equal 
assert_array_equal(the_einsum_ab, the_a_transpose_times_b) # This passes, so equality 

이 결과는 약간 더 일반적입니다. 이제 b = a을 사용하면 구체적인 결과를 얻을 수 있습니다.

+1

질문에 구체적인 예를 추가했습니다. – drevicko

+0

감사합니다. 업데이트에서 설명했습니다. 이 방법이 효과가 있습니까? – eickenberg

+0

네가 그것에 대해 생각할 때 뻔한 사실. 고마워 (: – drevicko

2

einsumnp.nditer의 C 버전을 사용하여 색인 문자열을 계산으로 변환합니다. http://docs.scipy.org/doc/numpy/reference/arrays.nditer.htmlnditer에 대한 좋은 소개입니다. 끝 부분의 예는 특히 Cython입니다.

https://github.com/hpaulj/numpy-einsum/blob/master/einsum_py.pyeinsum의 파이썬 시뮬레이션입니다.

scipy.sparse에는 기본 연산, 합계, 행렬 곱셈 등을 수행하는 자체 코드 (궁극적으로 C)가 있습니다. 희소 매트릭스는 자체 데이터 구조를 가지고 있습니다. 리스트, 사전 또는 numpy 배열 집합 일 수 있습니다. sparse에는 적절한 __xxx__ 메서드가 있기 때문에 번갈음 표기법을 사용할 수 있습니다.

희소 매트릭스는 2 차원 어레이 객체 matrix입니다. einsum의 스파 스가 작성 될 수 있지만 nditer이 아닌 희소 행렬 곱셈을 사용하게됩니다. 그래서 기껏해야 표기 편의가 될 것입니다.

def dot(self, other): 
    """Ordinary dot product 
    ... 
    """ 
    return self * other 

A=sparse.csr_matrix([[1,2],[3,4]]) 
A.dot(A.T).A 
(A*A.T).A 
A.__rmul__(A.T).A 
A.__mul__(A.T).A 
np.einsum('ij,kj',A.A,A.A) 
# array([[ 5, 11], 
#  [11, 25]])