3

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

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

因为我需要1s的位置,即

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

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

4

4 回答 4

9

您实际上希望增加1每行中 s 的数量(从 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]])
于 2013-04-16T22:28:48.827 回答
3

列出理解来救援!

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

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

于 2013-04-16T22:28:33.637 回答
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]
于 2013-04-16T22:56:47.687 回答
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)]
于 2013-04-17T04:08:12.293 回答