切片并更改numpy 2D数组,每行的列索引列表不同

切片并更改numpy 2D数组,每行的列索引列表不同,numpy,numpy-ndarray,numpy-slicing,Numpy,Numpy Ndarray,Numpy Slicing,我想使用列索引列表对2D numpy数组进行切片。困难在于每行的列索引不同。例如: x = np.array([[0, 1, 2] [3, 4, 5] [6, 7, 8]]) 我有一个列索引列表 indices = [[0, 1], [2, 1], [2, 2]] 这意味着我想为第0行获取列[0,1],为第1行获取列[2,1],为第2行获取列[2,2]。结果应该是 result = np.array([0, 1],

我想使用列索引列表对2D numpy数组进行切片。困难在于每行的列索引不同。例如:

x = np.array([[0, 1, 2]
              [3, 4, 5]
              [6, 7, 8]])
我有一个列索引列表

indices = [[0, 1], [2, 1], [2, 2]]
这意味着我想为第0行获取列
[0,1]
,为第1行获取列
[2,1]
,为第2行获取列
[2,2]
。结果应该是

result = np.array([0, 1],
                  [5, 4],
                  [8, 8]])
如何使用numpy的切片而不涉及for循环

编辑:

我看到一些答案提到使用
np。沿轴(x,索引,1)取\u
此函数通过对原始数组的值进行处理来创建一个新数组。这对于从数组中读取值非常有用,但不能用于增加原始数组的值。是否有任何类似的矩阵可用于修改原始数组的值,例如
np。沿_轴(x,索引,1)+=10取_?当然,行的列索引是唯一的,以避免歧义

你想要什么


链接问答的公认答案建议使用
A[np.arange(A.shape[0])[:,None],B]
进行索引,同样的索引操作也可以用于递增,即在RHS上只需执行
+=1
即可递增1。@Divakar这就像魔术一样,谢谢
np.take_along_axis(x, np.array(indices), axis = 1)
Out[]: 
array([[0, 1],
       [5, 4],
       [8, 8]])