以下代码位于我正在使用的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)))
感谢您提供任何建议!
答案 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)))