【问题标题】:How to compare diagonally opposed element of a multidimensional array with numpy如何将多维数组的对角元素与numpy进行比较
【发布时间】:2015-01-27 14:50:25
【问题描述】:

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

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

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

这将返回一个布尔矩阵,但我不知道如何处理。

非常感谢您的帮助

【问题讨论】:

    标签: python arrays numpy matrix multidimensional-array


    【解决方案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
    

    【讨论】:

    • 非常感谢 iluengo 的解决方案。您能否解释一下为什么选择对 ~np.isclose(triu,0) 使用 ~ 运算符?非常感谢
    • 当使用布尔数组时,~ 对数组求反(它的行为与 ! 相同,但用于对整个布尔矩阵求反)。 ~mask = not mask = !mask 但由于在这种情况下 mask 是一个多维 numpy 数组,所以第一个 ~ 是唯一有效的。
    猜你喜欢
    • 2018-06-28
    • 2021-06-24
    • 2015-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多