更快的3D矩阵操作 - 的Python

问题描述 投票:2回答:1

我可以用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周的时间。

python numpy matrix vector scipy
1个回答
1
投票

使用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)
© www.soinside.com 2019 - 2024. All rights reserved.