如何使用 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.]])

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

【讨论】:

我的意思不是在我的原始帖子中添加循环,哎呀。但我的问题是我没有将它用作循环外的迭代器,也没有使用下一个!谢谢。 误用时是邪恶的“无限循环”双胞胎 :)

以上是关于如何使用 itertools 继续使用列表中的值直到矩阵的对角线已满的主要内容,如果未能解决你的问题,请参考以下文章

Python itertools groupby 在列表理解中的多次使用

[PY3]——过滤数据——列表推导filter()itertools.compress()

如何将 itertools “grouper”对象变成列表

使用 itertools 将列表拆分为递增的序列

如何使用 python itertools.groupby() 按字符串的第一个字符对字符串列表进行分组?

以大于 Python 列表中的值的最小差值对大多数数字进行采样的最快方法