因此,我尝试使用较小的列表来填充较大矩阵的对角线。我认为在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.]])
由于cycle
和repeat
永远循环,因此不应在强制迭代的上下文中使用(不过,repeat
有一个可选参数来限制重复(。