我有一个非常大的数组,但在这里我将展示一个简化的情况:
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_array
的 mask
属性来区分要标记的元素并填写其他值。
关于arrays - Numpy argsort 同时区分 0 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65963898/