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