首页 > 解决方案 > Numpy argsort 同时区分 0 的值

问题描述

我有一个非常大的数组,但在这里我将展示一个简化的案例:

a = np.array([[3, 0, 5, 0], [8, 7, 6, 10], [5, 4, 0, 10]])
array([[ 3,  0,  5,  0],
       [ 8,  7,  6, 10],
       [ 5,  4,  0, 10]])

我想要argsort()数组,但有办法区分 0。我尝试将其替换为NaN

a = np.array([[3, np.nan, 5, np.nan], [8, 7, 6, 10], [5, 4, np.nan, 10]])
a.argsort()
array([[0, 2, 1, 3],
       [2, 1, 0, 3],
       [1, 0, 3, 2]])

NaNs 仍在排序中。有什么办法可以argsort让它的值为-1或其他东西。NaN或者除了替换0之外还有其他选择吗?我也试过math.inf没有成功。有人有什么想法吗?

这样做的目的是我有一个余弦相似度矩阵,并且我想排除那些相似度为 0 的实例。我argsort()用来获得最高相似度,这将为我提供另一个表的索引,并映射到标签。如果一个数组的整体相似度为 0([0,0,0]),那么我想忽略它。因此,如果我可以argsort()在排序后将其输出为 [-1,-1,-1],我可以检查整个数组是否为 -1 并排除它。

编辑:

所以输出应该是:

array([[0, 2, -1, -1],
       [2, 1, 0, 3],
       [1, 0, 3, -1]])

所以当用最后一行引用a时:最小的会是a[1],也就是4,然后是a[0],就是5,然后是a[3],就是10,最后—— 1,也就是 0

标签: arrayspython-3.xnumpysortingnp.argsort

解决方案


你可能想这样numpy.ma.array()使用

a = np.array([[3,4,5],[8,7,6],[5,4,0]])

用条件屏蔽这个数组a==0

a_mask = np.ma.array(a, mask=(a==0))
print(a_mask)
# output
masked_array(
  data=[[3, 4, 5],
        [8, 7, 6],
        [5, 4, --]],
  mask=[[False, False, False],
        [False, False, False],
        [False, False,  True]],
  fill_value=999999)
print(a_mask.mask)
# outputs
array([[False, False, False],
       [False, False, False],
       [False, False,  True]])

并且可以使用 的mask属性masked_array区分要标注的元素并填写其他值。


推荐阅读