获取不同长度的索引来切片多维 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]
。您需要决定这是否是满足您需求的结果。
给定这些数组,
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]
。您需要决定这是否是满足您需求的结果。