arrays - Numpy argsort 同时区分 0 的值

标签 arrays python-3.x numpy sorting np.argsort

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

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]])

但是 NaN 仍在排序。有没有办法让 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

最佳答案

您可能想像这样使用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]])

并且您可以使用 masked_arraymask 属性来区分要标记的元素并填写其他值。

关于arrays - Numpy argsort 同时区分 0 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65963898/

相关文章:

json - 如何使用 youtube-dl 从播放列表中的 Youtube 视频中提取上传日期、标题、URL 和持续时间?

python - 不和谐.py |为特定用户添加角色

python - 获取numpy数组的对角线

python - 如何高效的传递函数?

java - 打印数组 - 重写 toString() 方法

java - 我需要像表格一样打印我的数组

java - 如何在Jfreechart饼图中使用Arraylist(for循环)?

c++ - 如何在 C 风格数组上使用 find_if 和 reverse_iterator?

python - 从 Python 集合中删除已更改的对象

python - 使用 scipy 的 solve_bvp 求解 BVP