更快的3D矩阵运算-Python

时间:2019-02-03 13:36:39

标签: python numpy matrix vector scipy

例如,我正在使用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秒。

1 个答案:

答案 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)