在Numpy数组中为不同的索引位置分配值

13

假设我有一个数组

np.zeros((4,2))

我有一个值列表[4,3,2,1],我想将其分配到以下位置:[(0,0),(1,1),(2,1),(3,0)]

如何在不使用for循环或将数组展平的情况下完成?

我可以使用花式索引来检索值,但无法将它们分配。

======更新=========

感谢@hpaulj,我意识到原始代码中的错误是什么。

当我使用zeros_like初始化数组时,默认为int并截断值。因此,看起来我没有分配任何内容!


1
arr[idx[:,0], idx[:,1]] = [4,3,2,1],其中idx = np.array([[0,0],[1,1],[2,2],[3,1]]) - Divakar
2
位置(2,2)超出了原始数组的范围。 - wim
可以使用高级索引进行赋值。尝试 a[[0,1,2,3], [0,1,2,1]] = 4,3,2,1 - Paul Panzer
@wim 是的,你说得对。我改了问题。 - Junchen
2个回答

35

您可以使用元组索引:

>>> import numpy as np
>>> a = np.zeros((4,2))
>>> vals = [4,3,2,1]
>>> pos = [(0,0),(1,1),(2,0),(3,1)]
>>> rows, cols = zip(*pos)
>>> a[rows, cols] = vals
>>> a
array([[ 4.,  0.],
       [ 0.,  3.],
       [ 2.,  0.],
       [ 0.,  1.]])

是的,它能工作。但是,如果我将a初始化为np.zeros_like,它不会分配值,这真的很奇怪! - Junchen
编辑跟进:它在一个玩具示例中可以工作,但在我的以前代码中无法工作。我不确定错误出在哪里。 - Junchen
1
在使用zeros_like时要注意数据类型。将浮点数赋值给整数槽位会截断值。 - hpaulj
似乎在3D中无法正常工作。不确定是一个错误还是需要调整索引以适应3D。 - Victor Sg
如果我有一个例子,我想让其中一些发生多次。比如4出现在0,0和1,0? - Landon

4
这是基于@hpaulj的评论,精简了@wim答案的版本。 np.transpose会自动将Python元组列表转换为NumPy数组,并对其进行转置。 tuple将索引坐标转换为元组,这样做是因为在NumPy中a[rows, cols]等同于a[(rows, cols)]
import numpy as np
a = np.zeros((4, 2))
vals = range(4)
indices = [(0, 0), (1, 1), (2, 0), (3, 1)]
a[tuple(np.transpose(indices))] = vals
print(a)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接