说我有一个数组
np.zeros((4,2))
我有一个值列表[4,3,2,1],我想将其分配给以下位置: [(0,0),(1,1),(2,1),(3,0)]
如果不使用for循环或展平数组,我怎么能这样做?
我可以使用花式索引来检索值,但不能分配它们。
==更新======
感谢@hpaulj,我意识到原始代码中的错误是。
当我使用zeros_like启动数组时,它默认为int并截断值。因此,看起来我没有分配任何东西!
答案 0 :(得分:7)
您可以使用元组索引:
>>> 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.]])
答案 1 :(得分:0)
以下是基于@ hpaulj评论的@ wim答案的简化版本。 np.transpose
自动将元组的python列表转换为NumPy数组并对其进行转置。 tuple
将索引坐标转换为可用的元组,因为a[rows, cols]
相当于NumPy中的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)