例如,我正在使用Python中的3D矩阵,给定的矩阵大小为2x3x4:
[[[1 2 1 4]
[3 2 1 1]
[4 3 1 4]]
[[2 1 3 3]
[1 4 2 1]
[3 2 3 3]]]
我的任务是在每个维度矩阵的每一行中找到熵的值。例如,在[1,2,1,4]
上方的矩阵的维度1的第1行中,归一化值(因此总和为1)为[0.125, 0.25, 0.125, 0.5]
,并且通过公式{{1 }}其中i是归一化值。所得矩阵为2x3矩阵,其中每个维度中都有3个熵值(因为有3行)。
这是我的代码每次使用随机矩阵的工作示例:
-sum(i*log(i))
我的问题是我如何扩展该程序以使其能够用于非常大的3D矩阵(例如,尺寸为200x50x1000)?
我在Windows 10(带有Anaconda发行版)中使用Python。 使用200x50x1000的3D矩阵尺寸,我的计算机上的运行时间为290秒。
答案 0 :(得分:1)
使用entropy
的第二部分的定义以及第一部分的广播操作,一个矢量化解决方案将是-
p1 = matrix/matrix.sum(-1,keepdims=True).astype(float)
entropy_matrix_out = -np.sum(p1 * np.log(p1), axis=-1)
或者,我们可以在第二部分中使用einsum
来获得进一步的性能。增强-
entropy_matrix_out = -np.einsum('ijk,ijk->ij',p1,np.log(p1),optimize=True)