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

2024-03-29 07:53:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着做一个函数,得到这样一个矩阵:

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

所以我的问题是:我该怎么做才能使它只改变第一个和第二个索引相同的数字?(例如,更改权重列表[0][0],但不更改权重列表[0][1])。你知道吗


Tags: 函数in列表fordefcreaterange矩阵
3条回答

您的问题是,您反复存储同一个列表:

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

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

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

我看到你在试图构造身份矩阵。看看numpy.identity():例如:

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

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

相关问题 更多 >