모양 (8,9)이있는 scipy 스파 스 행렬과 모양 (9, 12, 17)이있는 다른 배열이 있습니다. 나는 (8,9) 행렬이 효과적으로 첫 번째 차원 만 곱한 크기/행렬 (8,12,17)을 얻도록 이러한 값을 곱합니다. 이 작업을 수행하기 위해 크로네 커 제품을 사용해야합니까, 아니면 numpy로 간단한 방법이 있습니까?numpy, scipy에서 다차원 행렬 곱셈을 수행하는 방법
답변
다음은 작동시키기위한 몇 가지 방법입니다. 두 번째 테스트가 더 좋고 12 배 빠릅니다.
def multiply_3D_dim_zero_slow(matrix, array):
shape = array.shape
final_shape = (matrix.shape[0], array.shape[1], array.shape[2])
result = np.zeros(final_shape)
for i in xrange(shape[1]):
for j in xrange(shape[2]):
result[:, i, j] = matrix * array[:, i, j]
return result.reshape(final_shape)
그리고 더 빠른 버전으로 다차원 배열을 2D 배열로 만듭니다.
def multiply_3D_dim_zero(matrix, array):
shape = array.shape
final_shape = (matrix.shape[0], array.shape[1], array.shape[2])
array_reshaped = array.reshape(shape[0], shape[1] * shape[2])
return (matrix * array_reshaped).reshape(final_shape)ode here
이것은 첫 번째 차원에서 효과가 있지만 필요한 것은 일반화 할 수 있습니다. hpaulj이 코멘트에 알 수 있듯이
'tensordot'는 이런 종류의 재 형성을하므로'점 '을 호출 할 수 있습니다. 그것은 올바른 순서로 그들을 얻기 위해 swapaxes 수도 있습니다. – hpaulj
는이 작업을 수행하는 가장 쉬운 방법은 조밀 한 매트릭스 np.einsum
입니다 :
>>> a = np.random.randn(8, 9)
>>> b = np.random.randn(9, 12, 17)
>>> c = np.einsum('ij,jkl->ikl', a, b)
>>> c.shape
(8, 12, 17)
m1
는 2D 희소 행렬 인 경우, m1.A
는 조밀 한 배열의 형태입니다. dinmensions는 실질적으로 einsum
표현을 씁니다. 예를 들어
np.einsum('ij,jkl->ikl', m1.A, m2)
:
In [506]: M = sparse.random(8, 9, 0.1)
In [507]: A = np.ones((9, 12, 17))
In [508]: np.einsum('ij,jkl->ikl', M.A, A).shape
Out[508]: (8, 12, 17)
@Divakar는 np.tensordot
을 권장하고 @hpaulj 및 @Praveen는 np.einsum
을 제안했다. 또 다른 방법은 전치되는 축 : 당신이 인용 작은 치수
(a @ b.transpose((2, 0, 1))).transpose((1, 2, 0))
는 np.einsum
및 전위가 빠른 것 같다. 하지만 일단 곱하는 축의 크기를 확대하기 시작하면 np.tensordot
이 다른 두 개의 수를 상회합니다.
import numpy as np
m, n, k, l = 8, 9, 12, 17
a = np.random.random((m, n))
b = np.random.random((n, k, l))
%timeit np.tensordot(a, b, axes=([1], [0]))
# => 10000 loops, best of 3: 22 µs per loop
%timeit np.einsum("ij,jkl->ikl", a, b)
# => 100000 loops, best of 3: 10.1 µs per loop
%timeit (a @ b.transpose((2, 0, 1))).transpose((1, 2, 0))
# => 100000 loops, best of 3: 11.1 µs per loop
m, n, k, l = 8, 900, 12, 17
a = np.random.random((m, n))
b = np.random.random((n, k, l))
%timeit np.tensordot(a, b, axes=([1], [0]))
# => 1000 loops, best of 3: 198 µs per loop
%timeit np.einsum("ij,jkl->ikl", a, b)
# => 1000 loops, best of 3: 868 µs per loop
%timeit (a @ b.transpose((2, 0, 1))).transpose((1, 2, 0))
# => 1000 loops, best of 3: 907 µs per loop
m, n, k, l = 8, 90000, 12, 17
a = np.random.random((m, n))
b = np.random.random((n, k, l))
%timeit np.tensordot(a, b, axes=([1], [0]))
# => 10 loops, best of 3: 21.7 ms per loop
%timeit np.einsum("ij,jkl->ikl", a, b)
# => 10 loops, best of 3: 164 ms per loop
%timeit (a @ b.transpose((2, 0, 1))).transpose((1, 2, 0))
# => 10 loops, best of 3: 166 ms per loop
'@'는'np.matmul'입니다 (새로운 Python이 없다면). docs에 대한'help (np.matmul)'. – hpaulj
- 1. OpenGL 4.3에서 행렬 곱셈을 수행하는 방법?
- 2. 행렬 곱셈을 사용하여 numpy 템플릿 매칭
- 3. numpy 다차원 (3d) 행렬 곱셈
- 4. 행렬 곱셈을 수행하는 동안 메모리 오류가 발생했습니다.
- 5. 대형 행렬 곱셈을 만드는 방법
- 6. matlab에서 행렬 곱셈을 수정하는 방법
- 7. sse 기반 행렬 곱셈을 향상시키는 방법
- 8. SQL에서 조건부 곱셈을 수행하는 방법
- 9. 파이썬에서 행렬 곱셈을 어떻게 가속화할까요?
- 10. numpy 행렬 곱셈 형태
- 11. r : 행렬 곱셈을 빠르게하는 방법 (특별한 경우)
- 12. 텐서 내부에서 행렬 곱셈을 벡터화하기
- 13. 행렬 곱셈을 사용하여 객체 회전
- 14. 파이썬 numpy memmap 행렬 곱셈
- 15. numpy/scipy에서 for 루프를 벡터화하는 중입니까?
- 16. SQL SELECT 문에서 곱셈을 수행하는 방법
- 17. 행렬 곱셈을 사용하여 OpenGL에서 큐브 회전
- 18. 파이썬에서 행렬 빼기/numpy
- 19. numpy/scipy에서 벡터화 된 색인/조각화?
- 20. Numpy/Scipy에서 대기 데이터의 빠른 3D 보간
- 21. Scipy에서 희소 행렬 열의 분산을 계산하려면 어떻게해야합니까?
- 22. numpy : 다차원 배열에서 작동
- 23. numpy 구조 배열을 수행하는 방법
- 24. Numpy 'smart'대칭 행렬
- 25. 행렬 배열 numpy
- 26. numpy 행렬 역속을 가속화하십시오.
- 27. ssrs의 행렬 보고서에서이를 수행하는 방법
- 28. MATLAB - RESIZE 명령이 아닌 행렬 곱셈을 사용하여 행렬 크기 조정
- 29. MATLAB에서 행렬 곱셈을 최적화하는 방법은 무엇입니까?
- 30. 행렬 곱셈을 사용하여 MS Solver Foundation 사용
출력이 너무 적습니까? – Divakar
아니요, 출력은 아마 같을 것입니다. – user1827975
그래서'.todense()'로 밀집 포맷으로 변환하고'np.dot/np.tensordot'를 사용합니까? – Divakar