7

저는 파이썬과 NumPy 로의 첫 진출을 통해 이미지 처리를하고 있습니다. 3 차원 NumPy 배열로로드 된 이미지가 있는데, 축 0은 이미지 밴드를 나타내고 축 1과 2는 픽셀의 열과 행을 나타냅니다. 여기에서 각 픽셀을 나타내는 3x1 행렬을 가져 와서 결과 이미지를 작성하는 데 사용될 다른 3x1 행렬을 생성하는 몇 가지 연산을 수행해야합니다.NumPy의 요소 단위 행렬 곱셈

import numpy as np 
import random 

factor = np.random.rand(3,3) 
input = np.random.rand(3,100,100) 
results = np.zeros((3,100,100)) 

for x in range(100): 
    for y in range(100): 
     results[:,x,y] = np.dot(factor,input[:,x,y]) 

을하지만이 날 같은 우아하고 비효율적 인 파업 :

내 첫 번째 방법 (간체 및 임의의 데이터로)은 다음과 같습니다. 내가 분명히 매우 유사 this 질문에 건너 온이 문제에 대한 해결책을 찾기 위해 노력하는 요소 현명한 FASION에서이 작업을 수행 할 수있는 방법, 예컨대 :

results = np.dot(factor,input,ElementWiseOnAxis0) 

있습니다. 그러나 저자는 문제를 만족스럽게 해결할 수 없었습니다. 나는 2012 년 이후에 어떤 것이 바뀌 었거나 내 문제가 해결하기가 더 쉽기를 바란다.

답변

10

험미 어레이는 기본적으로 요소 단위의 곱셈을 사용합니다. numpy.einsum 및 numpy.tensordot을 확인하십시오. 내 생각에 당신이 찾고있는 것 같아 :

results = np.einsum('ij,jkl->ikl',factor,input) 
+0

이것은 완벽하게 이러한 데이터에 대한 작동뿐만 아니라 유사한 문제에 적응해야합니다! – Joe

+1

필자의 경우 입력 모양은 (100, 100, 3)입니다. 그것을 이해하는 데 시간이 좀 걸렸지 만 다른 사람들에게 유용 할 수도 있습니다. 제 경우에는 다음과 같습니다 : results = np.einsum ('ij, klj-> kli', factor, input) – Luigolas