使二进制数组对称-NumPy/Python
如何将非对称numpy矩阵转换为对称矩阵 要求是:如果上三角形(对角线上方)的元素a[i][j]为1,则下三角形a[j][i]的元素应更改为1 对于下三角形也是如此,如果a[i][j]=1,则上三角形中的对称元素a[j][i]应为1 只关心将元素从0更改为1,don;t将其从0更改为1 我可以用两个或更多的for循环来解决这个问题,但我想知道如何以更具python风格的方式来解决它,并提高时间效率 提前谢谢 例如:使二进制数组对称-NumPy/Python,python,arrays,performance,numpy,Python,Arrays,Performance,Numpy,如何将非对称numpy矩阵转换为对称矩阵 要求是:如果上三角形(对角线上方)的元素a[i][j]为1,则下三角形a[j][i]的元素应更改为1 对于下三角形也是如此,如果a[i][j]=1,则上三角形中的对称元素a[j][i]应为1 只关心将元素从0更改为1,don;t将其从0更改为1 我可以用两个或更多的for循环来解决这个问题,但我想知道如何以更具python风格的方式来解决它,并提高时间效率 提前谢谢 例如: a= np.array ([[0, 0, 1, 0, 1],
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]])
一种完全带有
掩蔽的方式
-
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 [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]])
另加-
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)
另一个仅使用按位或ing
-
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 [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]])
非常感谢,迪瓦卡!我要试试这个!发布的解决方案对你有用吗?如果是的话,请考虑接受。