你能描述一下这次行动的情况吗?

时间:2018-06-13 02:47:05

标签: numpy matrix

以下代码位于我正在使用的Python程序中。 T和P都是3,414024个矩阵。我不熟悉'。'正在做,并且没有能够找到一个明确的答案。不幸的是,它使用了太多的内存,所以我试图找到一种更有效的编码操作方法:

np.matrix(T+P).T*np.matrix(T+P)

这是这一行的一部分:

N1 = (T+P)/np.sqrt(np.diag(np.matrix(T+P).T*np.matrix(T+P)))

感谢您提供任何建议!

2 个答案:

答案 0 :(得分:2)

以下行:

np.matrix(T+P).T*np.matrix(T+P)

基本上首先进行逐元素加法(T+P),然后使用.T转置结果。这是(矩阵)乘以(np.matrix(T+P)

得到的矩阵

以下是玩具示例:

In [14]: m
Out[14]: 
matrix([[1, 2, 3, 4],
        [2, 3, 4, 5]])

In [15]: n
Out[15]: 
matrix([[10, 20, 30, 40],
        [11, 21, 31, 41]])

In [16]: m.T * n
Out[16]: 
matrix([[ 32,  62,  92, 122],
        [ 53, 103, 153, 203],
        [ 74, 144, 214, 284],
        [ 95, 185, 275, 365]])

请注意,转置m(即m.T)是必须才能使矩阵乘法( * )正常工作。

从上面的示例中可以看出,结果矩阵的维数来自列的维度,因为行上的维度被抵消(4x2, 2x4 => 4x4)因此,因为你的矩阵非常庞大(3x414024),内存消耗也很大。

在加法运算(T+P)之后,结果矩阵的维数相同(3x414024)。在转置时,这变为(414024x3)。这反过来在矩阵上与另一个(3x414024)矩阵相乘得到一个维度矩阵(414024x414024),这绝对是一个巨大的矩阵。

答案 1 :(得分:2)

有几个明显的优化:

  • 仅计算T+P一次并将其存储在临时TP中,比如说
  • 不要仅计算完整矩阵TP.T @ TP  立即丢弃除了对角线以外的所有对象---而不是  首先计算对角线元素:  np.einsum('ij,ij->j', TP, TP)

使用你的数字,第二个应该减少计算时间和内存使用的完全荒谬的因素10 ^ 4 - 10 ^ 5.

此外:

  • 避免matrix课程支持array

总结一下,使用:

TP = T+P
N1 = TP/(np.sqrt(np.einsum('ij,ij->j', TP, TP)))