写一个更具解释性的问题标题有点难,但这里有一个更详细的解释。
我有一个二次数据框,如下所示:索引名=列名,对于每个图像,都有一个相似性得分。对于每个图像名,我需要提取前n个最相似的图像(按得分排序),并将它们存储在一个不占用太多空间的数据框中。
name_A.jpg name_B.jpg name_C.jpg name_D.jpg ...
name_A.jpg 1.000000 0.725098 0.291748 0.444336
name_B.jpg 0.725098 1.000000 0.255371 0.482178
name_C.jpg 0.291748 0.255371 1.000000 0.382812
name_D.jpg 0.444336 0.482178 0.382812 1.000000
name_E.jpg 0.197998 0.276611 0.183594 0.242065
name_F.jpg 0.309570 0.292236 0.327148 0.387695
name_G.jpg 0.302490 0.280273 0.339844 0.377197
name_H.jpg 0.261475 0.278076 0.258301 0.323975
name_J.jpg 0.243164 0.261963 0.304932 0.314453
name_K.jpg 0.269043 0.254639 0.247681 0.259766
name_L.jpg 0.251465 0.238892 0.227539 0.233887
name_M.jpg 0.287354 0.299805 0.216553 0.259766
name_N.jpg 0.413818 0.460938 0.239136 0.358398
name_O.jpg 0.394043 0.489258 0.293701 0.526855
name_P.jpg 0.262451 0.235229 0.224487 0.210083
name_Q.jpg 0.124634 0.137695 0.095032 0.142944
name_R.jpg 0.173218 0.187134 0.203491 0.194092
...
因此,所需的输出如下所示:
0 1 2 3 .... n
name_A.jpg name_B.jpg name_D.jpg name_N.jpg name_O.jpg
name_B.jpg
name_C.jpg
name_D.jpg
...
因此,如果我在网站上查看name_A.jpg
,推荐的产品是name_b.jpg, name_D.jpg, name_N.jpg, name_O.jpg
......在我的情况下,我有大约300,000张图像,我想显示前n = 50张最相似的图像,因此所需的输出 Dataframe 将具有300,000 x 50的尺寸。
当然,我可以只对每一列进行子集化,按降序使用sort()
,并对前50行进行封顶。然而,这需要一个for循环做同样的事情300 000次。还有其他更快的方法吗?
1条答案
按热度按时间abithluo1#
将列和
DataFrame
的值转换为numpy数组,并通过将数组转换为负值来获取降序值的位置,然后过滤输出第一个top1值(因为总是1
),并将前N
列值获取为新的DataFrame
: