在 for 循环中解压 `np.unravel_index()`

Unpack `np.unravel_index()` in for loop

我试图在 for 循环定义中直接解压从 np.unravel_index() 返回的元组,但我 运行 遇到以下问题:

for i,j in np.unravel_index(range(len(10)), (2, 5)):
    print(i,j)

returns:

ValueError: too many values to unpack (expected 2)

我可以通过以下方式解决问题:

idx = np.unravel_index(range(len(10)), (2, 5))
for i, j in zip(idx[0], idx[1]):
    print(i, j)

但我真的觉得我应该能够在 for 循环作业中完成所有工作。

我查看了 Whosebug,没有找到任何可以帮助我解决我的具体问题的东西。

解法: 作为公认的解决方案,我认为这正是我想要的,即直接在 for 循环赋值中解包,并且事先不知道 idx:

的维度
for i, j in zip(*np.unravel_index(range(len(10)), (2, 5)):
    print(i, j)

您的 idx 是一个数组元组:

In [559]: idx = np.unravel_index(np.arange(5),(2,5))
In [560]: idx
Out[560]: (array([0, 0, 0, 0, 0]), array([0, 1, 2, 3, 4]))

元组非常适合索引,例如data[idx]。事实上,这就是它的预期目的。

您的 zip 将其转换为 2 个元素元组的 list/iteration:

In [561]: list(zip(*idx))
Out[561]: [(0, 0), (0, 1), (0, 2), (0, 3), (0, 4)]

np.transpose也可以转成(n,2)数组:

In [562]: np.transpose(idx)
Out[562]: 
array([[0, 0],
       [0, 1],
       [0, 2],
       [0, 3],
       [0, 4]])

[562] 上的迭代将与 zip 上的迭代一样慢,可能更慢。但是如果不需要迭代的话,[562]可能会更好

注意我上面用了zip(*idx),所以你的表达式可以写成:

for i, j in zip(*np.unravel_index(range(len(neuron_sample)), (2, 5))):
    print(i, j)