【问题标题】:How to set lower triangular matrix of 0-1?如何设置0-1的下三角矩阵?
【发布时间】:2013-04-16 22:24:23
【问题描述】:

我需要为 n 维制作一个矩阵,在 n=4 时看起来像这样:

[0,0,0,0]
[1,0,0,0]
[1,1,0,0]
[1,1,1,0]

因为我需要1的位置,即

0, 1
0, 2
0, 3
1, 2
1, 3
2, 3

这是因为我想计算 x 点之间的距离,而不是浪费时间重复距离。这些坐标只能让我做一次。

【问题讨论】:

    标签: python arrays matrix numpy


    【解决方案1】:

    您实际上希望增加每一行中1s 的数量(从0 开始),同时用0s 填充该行的其余部分,从而保持恒定长度。试试这样的:

    >>> n = 4
    >>> [[1]*i + [0]*(n - i) for i in xrange(n)]
    [[0, 0, 0, 0], [1, 0, 0, 0], [1, 1, 0, 0], [1, 1, 1, 0]]
    

    如果您使用的是 NumPy:

    >>> import numpy as np
    >>> np.tril(np.ones((n, n), dtype=int), -1)
    array([[0, 0, 0, 0],
           [1, 0, 0, 0],
           [1, 1, 0, 0],
           [1, 1, 1, 0]])
    

    【讨论】:

      【解决方案2】:

      列出解析来拯救!

      >>> matrix = [[1]*i + [0]*(4-1) for i in range(4)]

      用您想要的任何范围替换 4。对于低于 3.X 的 Python,你应该 xrange 而不是 range

      【讨论】:

        【解决方案3】:

        为n=5

        matrix = [[1 if x<y else 0 for x in range(n)] for y in range(n)]
        

        输出:

        [0, 0, 0, 0, 0]
        [1, 0, 0, 0, 0]
        [1, 1, 0, 0, 0]
        [1, 1, 1, 0, 0]
        [1, 1, 1, 1, 0]
        

        【讨论】:

        • 您也可以简单地使用int(x&lt;y),而不是1 if x&lt;y else 0,仅供参考。
        【解决方案4】:

        您解释说,您想要下三角矩阵的原因是为了获得 1 的位置。如果这真的是制作矩阵的唯一原因,那么有更有效的方法来生成这些位置。特别是,itertools.combinations(range(n), 2) 会起作用:

        In [209]: import itertools
        
        In [210]: list(itertools.combinations(range(4), 2))
        Out[210]: [(0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3)]
        

        【讨论】:

          猜你喜欢
          • 2017-04-12
          • 2011-06-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-17
          相关资源
          最近更新 更多