我可以用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]
和熵的值由下式-sum(i*log(i))
其中i是归一化的值来计算。将所得的矩阵是2×3的矩阵,其中每个维度中有熵的3个值(因为有3行)。
下面是每次用随机矩阵我的代码工作示例:
from scipy.stats import entropy
import numpy as np
matrix = np.random.randint(low=1,high=5,size=(2,3,4)) #how if size is (200,50,1000)
entropy_matrix=np.zeros((matrix.shape[0],matrix.shape[1]))
for i in range(matrix.shape[0]):
normalized = np.array([float(k)/np.sum(j) for j in matrix[i] for k in j]).reshape(matrix.shape[1],matrix.shape[2])
entropy_matrix[i] = np.array([entropy(m) for m in normalized])
我的问题是我怎么向上扩展这一计划具有非常大的3D矩阵(例如具有200x50x1000大小)工作?
我在Windows 10使用Python(与蟒蛇分布)。使用的200x50x1000 3D矩阵大小,我得到了我的计算机上运行的290周的时间。
使用entropy
用于第二部分的所述第一部分的定义和广播的操作中,一个矢量化的解决办法是 -
p1 = matrix/matrix.sum(-1,keepdims=True).astype(float)
entropy_matrix_out = -np.sum(p1 * np.log(p1), axis=-1)
或者,我们可以使用einsum
第二部分进一步PERF。提振 -
entropy_matrix_out = -np.einsum('ijk,ijk->ij',p1,np.log(p1),optimize=True)