如何使用itertools保持使用列表中的值,直到矩阵的对角线满为止



因此,我尝试使用较小的列表来填充较大矩阵的对角线。我认为在itertools中使用cycle函数会使这项任务变得简单,但我似乎无法使其发挥作用。以下是我尝试的

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

但这使得它无休止地迭代。我希望一旦对角线填满,它就会停止。非常感谢其他更具蟒蛇风格的选择!

您的意思是使用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有一个可选参数来限制重复(。

最新更新