【问题标题】:Make a binary array symmetric - NumPy / Python使二进制数组对称 - NumPy / Python
【发布时间】:2020-08-05 22:17:11
【问题描述】:

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

【问题讨论】:

  • 发布的解决方案对您有用吗?如果是,请考虑接受。

标签: python arrays performance numpy


【解决方案1】:

一种纯粹使用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]])

【讨论】:

  • 非常感谢,迪瓦卡!我会试试这个!
猜你喜欢
  • 1970-01-01
  • 2021-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-23
  • 1970-01-01
相关资源
最近更新 更多