如何使用 itertools 继续使用列表中的值,直到矩阵的对角线已满

How to keep using values from a list until the diagonal of a matrix is full using itertools

所以我尝试使用较小的列表来填充较大矩阵的对角线。我认为在 itertools 中使用循环函数会使这成为一项简单的任务,但我似乎无法让它工作。这是我试过的

a = np.zeros((10,10))
b = [1, 2, 3, 4, 5]
for i in range(len(a.shape[0])):
     a[i, i] = list(itertools.cycle(b))

但这使得它无休止地迭代。我希望一旦对角线被填满它就会停止。非常感谢其他更 pythonic 的选项!

您的意思是使用 itertools.cycle,而不是 repeat。后者重复元素(列表),祝你好运将其设置为一个值,特别是如果你强制迭代(因为它永远运行)

我会在循环外的 cycle 对象上创建一个引用,并为对角线手动迭代赋值(使用 cycle 的唯一正确方法)。另请注意,您的循环 range 是错误的。 a.shape[0]是维度,不需要len

import numpy as np,itertools
a = np.zeros((10,10))
b = [1, 2, 3, 4, 5]
iterator = itertools.cycle(b)
for i in range(a.shape[0]):
     a[i, i] = next(iterator)

结果:

>>> a
array([[ 1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  2.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  3.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  4.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  5.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  2.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  3.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  4.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  5.]])

因为它们永远循环,所以 cyclerepeat 不应在强制迭代的上下文中使用(不过 repeat 有一个可选参数来限制重复)。