두 입력및 P
의 마지막 축을 줄입니다. 그래서, 당신과 같이, np.tensordot
을 사용할 수 있습니다 -
np.tensordot(Image,P,axes=(-1,-1))
이것은 또한 이전과 이후에 약간의 재편과 np.dot
로 표현 될 수 있으므로처럼 -
Image.reshape(-1,3).dot(P.T).reshape(Image.shape[:2]+(-1,))
하나 또한 A에 대한 np.einsum
을 사용할 수 있습니다 축소 작업, 그래서 같은 - 성능
np.einsum('ijk,lk->ijl',Image,P)
, 아니 축 정렬 요구 사항, 전적으로 감소 작동되고, dot-based
대용량 어레이의 경우 솔루션이 더 빠르지 만 작지만 적당한 크기의 어레이는 einsum
이 더 좋을 수 있습니다.
런타임 테스트
사례 # 1 :
In [46]: # Inputs
...: Image = np.random.randint(0,255,(256,256,3))
...: P = np.random.randint(0,255,(3,3))
...:
In [47]: %timeit change_base(Image,P)
...: %timeit np.tensordot(Image,P,axes=(-1,-1))
...: %timeit Image.reshape(-1,3).dot(P.T).reshape(Image.shape[:2]+(-1,))
...: %timeit np.einsum('ijk,lk->ijl',Image,P)
...:
1 loops, best of 3: 206 ms per loop
100 loops, best of 3: 3.28 ms per loop
100 loops, best of 3: 3.22 ms per loop
100 loops, best of 3: 3.06 ms per loop
사례 # 2 :
In [48]: # Inputs
...: Image = np.random.randint(0,255,(512,512,3))
...: P = np.random.randint(0,255,(3,3))
...:
In [49]: %timeit change_base(Image,P)
...: %timeit np.tensordot(Image,P,axes=(-1,-1))
...: %timeit Image.reshape(-1,3).dot(P.T).reshape(Image.shape[:2]+(-1,))
...: %timeit np.einsum('ijk,lk->ijl',Image,P)
...:
1 loops, best of 3: 845 ms per loop
100 loops, best of 3: 12.8 ms per loop
100 loops, best of 3: 12.7 ms per loop
100 loops, best of 3: 13.4 ms per loop
그것은 3 × 3 행렬, 기초 변화 매트릭스 – Gericault
그래서,의 게시 된 솔루션을했다 너를 위해 일해? – Divakar