您似乎正在尝试
sum-reduce的最后一个轴
XYZ_to_sRGB_mat_D50
(axis=1)与最后一个
XYZ_2
(axis=2)。因此,您可以
np.tensordot像这样使用-
np.tensordot(XYZ_2, XYZ_to_sRGB_mat_D50, axes=((2),(1)))
相关帖子了解
tensordot。
为了完整
np.matmul起见
XYZ_2,在交换的最后两个轴后,我们当然也可以使用,例如-
np.matmul(XYZ_to_sRGB_mat_D50, XYZ_2.swapaxes(1,2)).swapaxes(1,2)
这将不如
tensordot一个高效。
运行时测试-
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 solnIn [159]: %timeit XYZ_2.dot(XYZ_to_sRGB_mat_D50.T)1000 loops, best of 3: 450 µs per loopIn [160]: %timeit np.tensordot(XYZ_2, XYZ_to_sRGB_mat_D50, axes=((2),(1)))10000 loops, best of 3: 73.1 µs per loop
一般而言,涉及
sum-reductions张量时,
tensordot效率要高得多。由于的轴
sum-reduction只有一个,因此我们可以
2D通过重整,使用
np.dot,获取结果并将其整形为来将张量制成数组
3D。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)