Python:同时迭代列表和列表中的向量,只改变列表对[i] [i]

时间:2013-05-15 13:53:38

标签: python for-loop

我正在尝试创建一个产生如下矩阵的函数:

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

(但随后有40行40个数字而不是4 * 4)

我现在拥有的是:

def create_weights_hid_con():
    weights_list = []
    weight_vector = []
    for i in range(0, 40):
        weight_vector.append(0.0)
    for i in range(0, 40):
        weights_list.append(weight_vector)
    for i in range(0, len(weights_list)):
        weights_list[i][i] = 1.0
    return weights_list

我以为会这样做:

weights_list[0][0] = 1.0
weights_list[1][1] = 1.0
weights_list[2][2] = 1.0
etc.

但相反,它也会在两者之间做所有事情,产生这样的矩阵:

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

所以我的问题是:我该怎么做才能让它只改变第一个和第二个索引相同的数字? (例如,更改weights_list [0] [0],但不要更改weights_list [0] [1])。

4 个答案:

答案 0 :(得分:4)

您的问题是您一遍又一遍地存储相同的列表:

    weights_list.append(weight_vector)

因此,当您浏览它时,更改会影响每个列表。如果您强制复制,它将起作用,例如:

    weights_list.append(weight_vector[:])

还不清楚为什么每次都要附加权重向量。简单地初始化它会更有意义:

weight_vector = [0.0] * 40

虽然整个批次可以概括为列表理解:

>>> [[int(i == j) for i in range(4)] for j in range(4)]
[[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]

答案 1 :(得分:4)

这是因为您在执行append时没有添加新列表,而是添加了对相同列表的引用。无论如何,这是做你想做的事情的一种过于复杂的方式:

weights = [[0.0]*40 for i in range(40)]
for j in range(40):
    weights[j][j] = 1.0

答案 2 :(得分:2)

我看到你正在尝试构建单位矩阵。看看numpy.identity():例如:

>>> np.identity(3)
array([[ 1.,  0.,  0.],
       [ 0.,  1.,  0.],
       [ 0.,  0.,  1.]])

如果您仍想要列表,请使用numpy.tolist()

答案 3 :(得分:0)

weights = [[float(i==j) for i in range(40)] for j in range(40)]