python:广播切片np.array赋值给任意数量的维度

时间:2018-01-14 19:53:25

标签: python arrays numpy numpy-broadcasting

我分别有np.arrays形状(?,d),(?,n)和(?,d)的C,R和S;其中d <= n且问号代表任意数量的匹配尺寸。现在我想做以下任务(这当然不是正确的python代码,但如果?只是一个数字它可以工作):

for i in range(?):
    R[i][S[i]]=C[i]

那就是:我希望索引的每个元组i(在?指定的范围内)在R中取相应的数组R [i]并指定d个位置(由S [i]指定的位置)为数组C [i]中的值。

这样做的pythonic方式是什么?

示例:

设置

import numpy as np
m,n,d= 2,7,4
R=np.zeros((m,n))
C=np.arange(d*m).reshape((m,d))
S=np.array([[0,2,4,6],[3,4,5,6]])

这有效:

for i in range(m):
    R[i][S[i]]=C[i]

这不起作用:

R[S]=C

1 个答案:

答案 0 :(得分:0)

Your 2D example can be done as follows:

R[np.arange(m)[:, None], S] = C
# array([[ 0.,  0.,  1.,  0.,  2.,  0.,  3.],
#        [ 0.,  0.,  0.,  4.,  5.,  6.,  7.]])

The 3D case would be similar:

i, j, k = R.shape
i, j, k = np.ogrid[i, j, k]
R[i, j, S] = C

In ND one could write:

idx = np.ogrid[tuple(map(slice, R.shape))]
idx[-1] = S
R[idx] = C