对多维Numpy数组使用put时出现意外行为

tpxzln5u  于 12个月前  发布在  其他
关注(0)|答案(3)|浏览(141)

我有一个数组A定义为:

[[0, 0],
 [0, 0]]

我有一个列表I,其中包含A的索引,例如[(0, 1), (1, 0), (1, 1)],还有一个列表v,其中的值与I中的值一样多,例如[1, 2, 3]。我想用存储在v中的相应值替换A中包含在I中的索引处的条目。因此,预期结果是:

[[0, 1],
 [2, 3]]

我希望能够使用np.put来实现这一点。我试过:

np.put(A, I, v)

然而,运行上面的行后B的值是:

[[1., 3.],
 [0., 0.]]

为什么put会有这样的行为,我如何才能实现我所期望的结果?

uoifb46i

uoifb46i1#

为了补充@阿恩的答案,将索引分解以匹配put的通用方法是使用ravel_multi_index

np.put(A, np.ravel_multi_index(np.array(I).T, A.shape), v)

同样,通用索引方法将是:

A[tuple(zip(*I))] = v

修改A

array([[0, 1],
       [2, 3]])

3D示例:

A = np.zeros((2,3,4), dtype=int)
I = [(0,1,2), (1,1,1)]
v = [1, 2]

np.put(A, np.ravel_multi_index(np.array(I).T, A.shape), v)
# or
# A[tuple(zip(*I))] = v

输出量:

array([[[0, 0, 0, 0],
        [0, 0, 1, 0],
        [0, 0, 0, 0]],

       [[0, 0, 0, 0],
        [0, 2, 0, 0],
        [0, 0, 0, 0]]])
06odsfpq

06odsfpq2#

IIUC,您可以:

I = np.array(I)
A[I[:, 0], I[:, 1]] = v

print(A)

图纸:

[[0 1]
 [2 3]]
rnmwe5a2

rnmwe5a23#

np.put()期望索引列表包含整数(而不是元组),索引目标数组的平面版本。你可以改变你的指数来符合这个期望:

import numpy as np

A = np.array([[0, 0],
              [0, 0]])
I = [(0, 1), (1, 0), (1, 1)]
v = [1, 2, 3]

n_cols = A.shape[1]
I_flat = [n_cols * i + j for i, j in I]

np.put(A, I_flat, v)
print(A)

然后输出如预期的那样:

[[0 1]
 [2 3]]

相关问题