您正在減少兩個輸入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
這是一個3x3矩陣,依據變化的矩陣 – Gericault
所以,做了發佈解決方案爲你工作? – Divakar