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

时间:2017-09-22 02:46:59

标签: python 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.        ]])

由于

1 个答案:

答案 0 :(得分:2)

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

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),
...