如何将一个非对称numpy矩阵转换为对称矩阵?
要求是:如果上三角形(对角线以上)的元素a[i][j]为1,则下三角形的元素a[j][i]应改为1。
同样是下三角形,如果a[ i ][ j ]=1,上三角形的对称元素a[ j ][ i ]应该是1。
只要把元素从0变到1就可以了,不要从0变到1。
我可以用两个或更多的for循环来解决,但我想知道如何用更pythonic的方式来解决它,并提高时间效率?
先谢谢你!
比如说
a= np.array ([[0, 0, 1, 0, 1],
[0, 0, 0, 1, 1],
[0, 0, 0, 1, 1],
[1, 1, 0, 0, 0],
[1, 1, 0, 1, 0]])
结果应该是:
a= np.array ([[0, 0, 1, 1, 1],
[0, 0, 0, 1, 1],
[1, 0, 0, 1, 1],
[1, 1, 1, 0, 1],
[1, 1, 1, 1, 0]])
解决方案:
纯粹用一种方法 masking
–
In [40]: m = a==1
In [41]: (m | m.T).view('i1')
Out[41]:
array([[0, 0, 1, 1, 1],
[0, 0, 0, 1, 1],
[1, 0, 0, 1, 1],
[1, 1, 1, 0, 1],
[1, 1, 1, 1, 0]], dtype=int8)
另一个加法–
In [55]: ((a.T + a)>0).view('i1')
Out[55]:
array([[0, 0, 1, 1, 1],
[0, 0, 0, 1, 1],
[1, 0, 0, 1, 1],
[1, 1, 1, 0, 1],
[1, 1, 1, 1, 0]], dtype=int8)
另一个只有 bitwise-OR-ing
–
In [57]: (a.T | a)
Out[57]:
array([[0, 0, 1, 1, 1],
[0, 0, 0, 1, 1],
[1, 0, 0, 1, 1],
[1, 1, 1, 0, 1],
[1, 1, 1, 1, 0]])