使二进制数组对称 – NumPy Python

如何将一个非对称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]])

给TA打赏
共{{data.count}}人
人已打赏
解决方案

合并排序时出现StackOverFlowException异常。

2022-4-22 21:00:23

解决方案

每个ID的两个时期的 "分数 "之差。

2022-4-22 22:00:09

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索