は、それはあなたがXYZ_2
(axis=2)
の最後の1でsum-reduce
にXYZ_to_sRGB_mat_D50
(axis=1)
の最後の軸をしようとしているようです。
np.tensordot(XYZ_2, XYZ_to_sRGB_mat_D50, axes=((2),(1)))
Related post to understand tensordot
- だから、あなたはそうのようなnp.tensordot
を使用することができます。完全のために
、我々は確かにそうように、XYZ_2
の最後の二つの軸をswappping後、あまりにもnp.matmul
を使用することができます -
np.matmul(XYZ_to_sRGB_mat_D50, XYZ_2.swapaxes(1,2)).swapaxes(1,2)
これはtensordot
1ほど効率的ではありません。
ランタイムテスト - それはテンソルでsum-reductions
に来るとき
In [158]: XYZ_to_sRGB_mat_D50 = np.asarray([
...: [3.1338561, -1.6168667, -0.4906146],
...: [-0.9787684, 1.9161415, 0.0334540],
...: [0.0719453, -0.2289914, 1.4052427],
...: ])
...:
...: XYZ_1 = np.asarray([0.25, 0.4, 0.1])
...: XYZ_2 = np.random.rand(100,100,3)
# @Julien's soln
In [159]: %timeit XYZ_2.dot(XYZ_to_sRGB_mat_D50.T)
1000 loops, best of 3: 450 µs per loop
In [160]: %timeit np.tensordot(XYZ_2, XYZ_to_sRGB_mat_D50, axes=((2),(1)))
10000 loops, best of 3: 73.1 µs per loop
一般tensordot
がはるかに効率的である、話します。 sum-reduction
の軸はちょうど1であるので、テクスチャを2D
に再整形することで、np.dot
を使用して結果を得て、3D
に戻すことができます。
ありがとう - この回答は素晴らしいです。興味深いことに、テンソルドは、ここで転調して普通のドットを打ち、スピードワイズです。 –
@BrandonDubeテンソルの場合、 'dot'はあるレベル(おそらくCレベル)でループしていますが、' tensordot'はそれを避けています。 – Divakar
うわー!それを知らなかった!なぜ形状を変えるのが10倍速くなるのかについての洞察はありますか?それは意味をなさないと思われます... – Julien