Numpy NdArray - 如何设置阈值然后对值进行排序

时间:2018-02-05 06:47:18

标签: python pandas sorting numpy threshold

我有一个名为'sim'的numpy ndarray(4 x 4)表示4个项目(a,b,c,d)之间的相似度值。

array([[ 1.        ,  0.        ,  0.5547002 ,  0.73960026],
       [ 0.        ,  1.        ,  0.        ,  0.66666667],
       [ 0.5547002 ,  0.        ,  1.        ,  0.33333333],
       [ 0.73960026,  0.66666667,  0.33333333,  1.        ]])

dataset_u是一个包含[a,b,c,d]的列表 以下代码对数组进行排序,然后根据项目的同一性值识别项目a,b,c,d中的前3项(related_count)。

related_count =3
dataidx = np.asarray(dataset_u) # a,b,c,d
indices = np.argsort(-sim, axis=1)
result = np.hstack((dataidx[:, None], dataidx[indices]))
m1 = result.shape[0]
mask = np.c_[[True] * m1, result[:, 1:] != result[:, 0, None]]
final_mat = result[mask].reshape(m1, -1)
dfdownload = pd.DataFrame(final_mat[:, 1:related_count], index=final_mat[:, 0])

dfdownload:

enter image description here

如何修改上面的代码,以便在排序数组之前只考虑值> = 0.5? 例如,对于项目“a”,预期的相关项目为“d”,“c”,而对于项目“b”,其相关项目仅为“d”(0.66666667)。

1 个答案:

答案 0 :(得分:0)

我对numpypandas都很陌生,所以这可能不是最好的方法,我希望它能引导您找到更好的解决方案。

sim_copy = sim.copy()
sim_copy[sim_copy <= 0.5] = 0
bool_sim = np.asarray(sim_copy, dtype=bool)
dfdownload.mask(~bool_sim[:, :-1])
# -1 can be replaced with related_count, but its value seems wrong.

输出

     0    1    2
a    d  NaN    b
b  NaN    a  NaN
c    a  NaN    d
d    a    b  NaN

另一方面,related_count的值应为4而不是3,但我再也不确定:)。