【问题标题】:Populating a matrix with only a single list input仅使用单个列表输入填充矩阵
【发布时间】:2021-12-16 07:56:39
【问题描述】:

我有一个代码 sn-p,它通过一个接一个地填充上面的元素然后填充下面的元素来创建一个矩阵(如果上面的元素是x,那么下面的元素是1/x

n = 4
m = np.ones([n, n])
for i in range(0,n):
    for j in range(0,n):
         if i < j:
             x = input()
             m[i, j] = float(x) 
             m[j, i] = 1 / float(x) 

在第二个代码中,我可以一次填充矩阵,但我需要从左上角到右下角逐行填充元素

n = int(input())
entries = list(map(int, input().split()))
matrix = np.array(entries).reshape(n, n)

我的问题是:有什么方法可以像第一个 sn-p 一样首先填充矩阵的上三角形,但只能像第二个 sn-p 一样输入一次列表?

例如

n = 3

输入 = 2 3 4(列表)

Expected output=
[[1.         2.         3.        ]
 [0.5        1.         4.        ]
 [0.33333333 0.25       1.        ]]

【问题讨论】:

    标签: python list numpy loops matrix


    【解决方案1】:

    np.triu_indices 是你的朋友。此函数提供矩阵上三角形的索引。您可以使用索引将平面列表分配到您想要的矩阵部分:

    n = int(input())
    entries = np.array(list(map(int, input().split())))
    matrix = np.ones((n, n))
    r, c = np.triu_indices(n, 1)
    matrix[r, c] = entries
    matrix[c, r] = 1 / entries
    

    由于您的矩阵是方阵,同时提供n 和列表是多余的,因为列表的长度必须是triangular numberlen(entries) = (n**2 - n) / 2,只有当 1 + 8 * len(entries) 是奇数完全平方时才有有效的整数解:

    entries = np.array(list(map(int, input().split())))
    d = np.sqrt(1 + 8 * entries.size)
    if np.round(d) != d or d % 2:
        raise ValueError('invalid number of entries')
    n = (d + 1) // 2
    

    【讨论】:

    • 谢谢,这是我一直在寻找的!
    • 嗨,@Mad Physicist 恐怕我在检查时不够彻底,因为示例 (n) 太小,这似乎不是我要寻找的答案。如果我有n = 4,并且条目= 1 2 3 4 5 6,我期望底部三角形“镜像”矩阵的顶部三角形。这是另一个让您知道区别的示例。我期待 [[1,1,2,3], [1,1,4,5], [0.5,0.25, 1,6], [0.3,0.2,0.16666667,1]] 而不是 [[1,1,2,3], [1,1,4,5], [0.5,0.33333333, 1,6], [0.25,0.2,0.16666667,1]] 如果你知道我该怎么做,请帮助我,谢谢
    • @manacoder。你说得对。我修复了索引。应该交换 triu_indices 的两个组件,而不是使用 tril_indices 生成新集合。
    猜你喜欢
    • 2014-03-22
    • 1970-01-01
    • 2015-04-22
    • 2015-05-20
    • 1970-01-01
    • 2018-01-05
    • 2014-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多