我有一个非对称矩阵,基本上我想比较对角元素如下:
如果对角线相对的元素相等但符号相反,则保持元素的绝对值并将对角线相反的值置零
如果不是这样,那么两个元素中的一个是0(但我们不知道哪一个),所以取两者的绝对值。
完成此操作后,转置矩阵的下三角形并将其添加到上三角形。
我提出了以下python循环:
for i in range(0, number_files):
for j in range(0, len(Identifier)):
for k in range(0,len(Identifier)):
if Matrix[i][j][k] == - Matrix[i][k][j]:
Matrix[i][j][k] = abs(Matrix[i][j][k])
Matrix[i][k][j] = 0
else:
Matrix[i][j][k] = abs(Matrix[i][j][k]) # one of this two
Matrix[i][k][j] = abs(Matrix[i][k][j]) # values is 0
Matrix[i] = np.tril(Matrix[i],0).transpose() + np.triu(Matrix[i],0)
然而,这非常缓慢,我想知道如何用numpy来改善它。
我知道我可以通过以下方式生成测试:
test=np.isclose(Matrix.transpose(),-Matrix)
将返回一个布尔矩阵,但我不知道如何继续。
非常感谢您的帮助
答案 0 :(得分:1)
让我们从创建样本矩阵开始:
>>> a = np.random.randint(-3, 3, 100).reshape(10,10)
获取其上下三角形:
>>> triu = np.triu(a)
>>> tril = np.tril(a)
请注意,triu
和tril
的大小与a
相同,但在三角形外填充零。
定义要修改的三角形,并转置另一个。例如。修改上三角形:
>>> tril = tril.T
根据您的建议,执行以下操作之一以创建适用您的条件的面具:
# For integer data
>>> mask = (triu == -tril) & (triu != 0)
# For real data
>>> mask = np.isclose(triu, -tril) & ~np.isclose(triu, 0)
请注意添加了新条件(!= 0
),以避免在triu
和tril
填充0
的情况下进行比较比较。 mask
将包含True
,其中上方三角形triu
中的元素与下方三角形tril
匹配。
实施您的条件:
# Second and abs part of the first condition
>>> a = np.abs(a)
# Set upper diagonal when matches lower diagonal to 0
>>> a[mask] = 0