在this question中,解释了如何访问给定矩阵的lower
和upper
三角部分,例如:
m = np.matrix([[11, 12, 13],
[21, 22, 23],
[31, 32, 33]])
字符串
在这里,我需要将矩阵转换为1D数组,可以这样做:
indices = np.triu_indices_from(m)
a = np.asarray( m[indices] )[-1]
#array([11, 12, 13, 22, 23, 33])
型
在对a
进行大量计算,更改其值后,它将用于填充对称2D数组:
new = np.zeros(m.shape)
for i,j in enumerate(zip(*indices)):
new[j]=a[i]
new[j[1],j[0]]=a[i]
型
返回:
array([[ 11., 12., 13.],
[ 12., 22., 23.],
[ 13., 23., 33.]])
型
有没有更好的方法来实现这一点?更具体地说,避免Python循环来重建2D数组?
5条答案
按热度按时间x33g5p2x1#
将向量放回2D对称数组的最快、最聪明的方法是这样做:
情况1:无偏移(k=0),即上三角形部分包括对角线
字符串
即使您使用
numpy.matrix
代替numpy.array
,上述也可以正常工作。情况2:具有偏移(k= l),即上三角形部分不包括对角线
型
34gzjxbg2#
你只是想组成一个对称的数组吗?您可以完全跳过对角线索引。
字符串
从下列项目建立对称数组:
型
ccrfmcuu3#
您可以使用数组创建例程(如numpy.triu、numpy.tril和numpy.diag)从三角形创建对称矩阵。这是一个简单的3x3示例。
字符串
加上转置并减去对角线:
型
xu3bshqb4#
比大型矩阵的公认解决方案更快:
字符串
t3irkdon5#
你可以使用SciPy中的squareform。它添加了一个零对角线,您可以按如下方式避免:
字符串
通过从形状值开始的倒计数的累积和获得索引,其中预先插入零以包括第零个元素。