2

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

[[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

4 回答 4

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]]
于 2013-05-15T13:57:26.780 回答
4

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

weights = [[0.0]*40 for i in range(40)]
for j in range(40):
    weights[j][j] = 1.0
于 2013-05-15T13:58:24.223 回答
2

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

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

如果您仍然想要一个列表,只需使用numpy.tolist()

于 2013-05-15T13:58:41.520 回答
0
weights = [[float(i==j) for i in range(40)] for j in range(40)] 
于 2013-05-15T14:01:35.890 回答