如何设置一个由0和1构成的下三角矩阵?

3

我需要制作一个矩阵,对于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个点之间的距离,而不浪费时间重复计算距离。这些坐标可以让我只计算一次。
4个回答

10

您需要的是在每一行中从0开始递增数字1,同时用0填充其余部分,以保持长度不变。可以尝试以下代码:

>>> 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]])

3

列表推导式来拯救!

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

将4替换为您想要的任何范围。对于Python 3.X以下版本,应该使用xrange而不是range


1

对于 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]

1
你也可以使用int(x<y)来代替1 if x<y else 0,供你参考。 - arshajii

1
你解释说你想要下三角矩阵的原因是为了得到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)]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接