numpy의 einsum
기능이 scipy.sparse
행렬에서 작동하지 않는 것 같습니다. einsum
이 희소 행렬로 할 수있는 일을하는 대안이 있습니까?희소 행렬에 einsum
@ eickenberg의 대답에 대한 응답으로 : 내가 원하는 특정 전자는 numpy.einsum("ki,kj->ij",A,A)
- 행의 바깥 쪽 제품의 합계입니다.
numpy의 einsum
기능이 scipy.sparse
행렬에서 작동하지 않는 것 같습니다. einsum
이 희소 행렬로 할 수있는 일을하는 대안이 있습니까?희소 행렬에 einsum
@ eickenberg의 대답에 대한 응답으로 : 내가 원하는 특정 전자는 numpy.einsum("ki,kj->ij",A,A)
- 행의 바깥 쪽 제품의 합계입니다.
행렬의 제한은 선형 연산자를 나타내므로 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
을 사용하면 구체적인 결과를 얻을 수 있습니다.
질문에 구체적인 예를 추가했습니다. – drevicko
감사합니다. 업데이트에서 설명했습니다. 이 방법이 효과가 있습니까? – eickenberg
네가 그것에 대해 생각할 때 뻔한 사실. 고마워 (: – drevicko
einsum
은 np.nditer
의 C 버전을 사용하여 색인 문자열을 계산으로 변환합니다. http://docs.scipy.org/doc/numpy/reference/arrays.nditer.html은 nditer
에 대한 좋은 소개입니다. 끝 부분의 예는 특히 Cython
입니다.
https://github.com/hpaulj/numpy-einsum/blob/master/einsum_py.py은 einsum
의 파이썬 시뮬레이션입니다.
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]])
예, 대안이 있습니다,하지만 일반적으로 "스파 스 einsum"는 없다 :
스파 스
csr_matrix.dot
이다. 그것은 당신이해야 할 일에 달려 있습니다. –