获取不同长度的索引来切片多维 numpy 数组

Getting indices of different lengths to slice a multidimensional numpy array

给定这些数组,

  R = np.array([[ 5.,  3.,  2.,  7.,  3.,  6.,  8.,  9., 10., 55.],
                  [ 5.,  4.,  2.,  7.,  3.,  6.,  8., 10., 10., 55.]])
  F = np.array([[ 0.2 ,  0.4 ,  0.1 ,  0.3 ,  0.25,  0.25,  0.2 ,  0.1 ,  0.1 , 0.1 ],
                  [ 0.3 , -0.4 ,  0.1 ,  0.3 ,  0.25,  0.25,  0.4 , -0.4 ,  0.1 , 0.1 ]])
  K = nparray([[2],
                 [1]])

我想对 F 的每一行进行排序,然后找到第一行的第一个 K[0] 索引和第二行的第一个 K[1] 索引 F。然后使用这些索引,我想将 1 添加到 R.

的元素

这是我的尝试,我能够得到索引:

indices = np.argsort(F)[np.tile(np.arange(F.shape[1]),(F.shape[0],1)) < K]
# indices =  np.array([7, 8, 7], dtype=int64)

但我不确定如何在不使用 for 循环的情况下向量化以下操作。

Rnew = R.copy()

Rnew[0,7] =R[0,7]+1

Rnew[0,8] =R[0,8]+1

Rnew[1,7] =R[1,7]+1

Rnew = np.array([[ 5.,  3.,  2.,  7.,  3.,  6.,  8., 10., 11., 55.],
                 [ 5.,  4.,  2.,  7.,  3.,  6.,  8., 11., 10., 55.]])

我认为这应该可行:

m = np.arange(F.shape[1]) < K
Rnew = R.copy()
Rnew[np.nonzero(m)[0], np.argsort(F)[m]] += 1

因为第一行使用了广播,所以不需要np.tile()

请注意,结果可能存在歧义:因为 F 的每一行都有重复多次的值(例如,第一行为 0.1,第二行为 -0.4)np.argsort() 可能会给出 F 的元素的不同排序,具体取决于这些相等值的排序方式。这可能会改变矩阵 R 的哪些条目将被递增。例如,代码可以递增条目 R[0, 2]R[0, 9]R[1, 1],而不是递增 R[0, 7]R[0, 8]R[1, 7]。要获得明确的结果,您可以指定 np.argsort() 必须使用稳定的排序算法,这将保留具有相等值的元素的相对顺序:

m = np.arange(F.shape[1]) < K
Rnew = R.copy()
Rnew[np.nonzero(m)[0], np.argsort(F, kind="stable")[m]] += 1

在此特定示例中,这将增加条目 R[0, 2]R[0, 7]R[1, 1]。您需要决定这是否是满足您需求的结果。