将每行最小的 2 个元素的 numpy 数组元素设置为零



例如

E = 
array([[ 10.        ,   2.38761596,   7.00090613,   4.51495754],
       [  2.38761596,  10.        ,   2.80035826,   1.        ],
       [  7.00090613,   2.80035826,  10.        ,   5.95109207],
       [  4.51495754,   1.        ,   5.95109207,  10.        ]])

最小2的索引可以从Argsort 获得:

IndexSortE = np.argsort(E)
smallest2 = IndexSortE[:,0:2]
smallest2
array([[1, 3],
       [3, 0],
       [1, 3],
       [1, 0]])

现在如何获得E0?:

E0 = 
array([[ 10.        ,   0.00000000,   7.00090613,   0.00000000],
       [  0.00000000,  10.        ,   2.80035826,   0.00000000],
       [  7.00090613,   0.00000000,  10.        ,   0.00000000],
       [  0.00000000,   0.00000000,   5.95109207,  10.        ]])

谢谢

您可以创建另一个行索引数组;然后利用高级索引来修改相应的值:

E[np.arange(E.shape[0])[:,None], smallest2] = 0
E
#array([[ 10.        ,   0.        ,   7.00090613,   0.        ],
#       [  0.        ,  10.        ,   2.80035826,   0.        ],
#       [  7.00090613,   0.        ,  10.        ,   0.        ],
#       [  0.        ,   0.        ,   5.95109207,  10.        ]])

要添加一些解释,请使用np.broadcast_arrays查看这些索引的广播方式:

np.broadcast_arrays(np.arange(E.shape[0])[:,None], smallest2)
# [array([[0, 0],
#         [1, 1],
#         [2, 2],
#         [3, 3]]), array([[1, 3],
#         [3, 0],
#         [1, 3],
#         [1, 0]])]

给出一个长度的两个列表,第一个列表给出了行索引,而第二个列表给出了列索引。现在,根据高级索引规则,此对将位于

的元素
(0, 1), (0, 3), 
(1, 3), (1, 0),
...

等。

最新更新