我需要制作一个矩阵,对于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个点之间的距离,而不浪费时间重复计算距离。这些坐标可以让我只计算一次。
您需要的是在每一行中从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]]
>>> 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]])
列表推导式来拯救!
>>> matrix = [[1]*i + [0]*(4-1) for i in range(4)]
将4替换为您想要的任何范围。对于Python 3.X以下版本,应该使用xrange
而不是range
。
对于 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]
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)]
int(x<y)
来代替1 if x<y else 0
,供你参考。 - arshajii