如何使用 itertools 继续使用列表中的值直到矩阵的对角线已满
Posted
技术标签:
【中文标题】如何使用 itertools 继续使用列表中的值直到矩阵的对角线已满【英文标题】:How to keep using values from a list until the diagonal of a matrix is full using itertools 【发布时间】:2018-11-19 20:10:23 【问题描述】:所以我尝试使用较小的列表来填充较大矩阵的对角线。我认为在 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 的选项!
【问题讨论】:
你在尝试什么?将诊断设置为 1,然后 2,然后 3 等? 【参考方案1】:您的意思是使用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 继续使用列表中的值直到矩阵的对角线已满的主要内容,如果未能解决你的问题,请参考以下文章
Python itertools groupby 在列表理解中的多次使用
[PY3]——过滤数据——列表推导filter()itertools.compress()