您正在减少两个输入Image
和的最后一个轴P
。所以,你可以np.tensordot
像这样使用 -
np.tensordot(Image,P,axes=(-1,-1))
这也可以表示为np.dot
在它之前和之后进行一些重塑,就像这样 -
Image.reshape(-1,3).dot(P.T).reshape(Image.shape[:2]+(-1,))
也可以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