我正在尝试创建一个产生如下矩阵的函数:
[[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])。
答案 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)]