我想要一个能制作相邻矩阵的算法。输入的是一个1D列表,输出的是一个2D列表,上面有数字的变化。这就是我的算法。
n_clusters = 5
user = [4, 4, 4, 2, 3, 3, 0, 0, 0] # input array
movement_counts = [[0] * n_clusters] * n_clusters # row is from, col is to
prev_label = user[0]
for label in user[1:]:
if label != prev_label:
movement_counts[prev_label][label] += 1
prev_label = label
这将返回
[[1, 0, 1, 1, 0],
[1, 0, 1, 1, 0],
[1, 0, 1, 1, 0],
[1, 0, 1, 1, 0],
[1, 0, 1, 1, 0]]
但我想让它返回这个。
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 1, 0],
[1, 0, 0, 0, 0],
[0, 0, 1, 0, 0]]
为什么它把整个列都填上数字 而不是只有一个元素?
替换为:[4, 4, 4, 2, 3, 3, 0, 0, ...]。
movement_counts = [[0] * n_clusters] * n_clusters
替换为:
movement_counts = [[0] * n_clusters for _ in range(n_clusters)]
因为: movement_counts = [[0] * n_clusters] * n_clusters
生成的列表包含指向内存中相同引用的子列表,所以如果你改变任何一个子列表中的任何一个元素,改变将发生在所有的子列表中。