python: 广播切片 np.array 分配给任意数量的维度
python: broadcast sliced np.array assignment to any number of dimensions
我有np.arrays个C,R,S分别是(?,d),(?,n),(?,d);其中 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
您的 2D 示例可以按如下方式完成:
R[np.arange(m)[:, None], S] = C
# array([[ 0., 0., 1., 0., 2., 0., 3.],
# [ 0., 0., 0., 4., 5., 6., 7.]])
3D 情况类似:
i, j, k = R.shape
i, j, k = np.ogrid[i, j, k]
R[i, j, S] = C
在 ND 中可以这样写:
idx = np.ogrid[tuple(map(slice, R.shape))]
idx[-1] = S
R[idx] = C
我有np.arrays个C,R,S分别是(?,d),(?,n),(?,d);其中 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
您的 2D 示例可以按如下方式完成:
R[np.arange(m)[:, None], S] = C
# array([[ 0., 0., 1., 0., 2., 0., 3.],
# [ 0., 0., 0., 4., 5., 6., 7.]])
3D 情况类似:
i, j, k = R.shape
i, j, k = np.ogrid[i, j, k]
R[i, j, S] = C
在 ND 中可以这样写:
idx = np.ogrid[tuple(map(slice, R.shape))]
idx[-1] = S
R[idx] = C