如何比较多维数组的对角元素与numpy

时间:2014-11-28 23:36:13

标签: python arrays numpy matrix multidimensional-array

我有一个非对称矩阵,基本上我想比较对角元素如下:

  • 如果对角线相对的元素相等但符号相反,则保持元素的绝对值并将对角线相反的值置零

  • 如果不是这样,那么两个元素中的一个是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)

将返回一个布尔矩阵,但我不知道如何继续。

非常感谢您的帮助

1 个答案:

答案 0 :(得分:1)

让我们从创建样本矩阵开始:

>>> a = np.random.randint(-3, 3, 100).reshape(10,10)

获取其上下三角形:

>>> triu = np.triu(a)
>>> tril = np.tril(a)

请注意,triutril的大小与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),以避免在triutril填充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