如何快速构造判断产品是否来自同一网店的n×n二进制关联矩阵
优化方案
你原来的双层循环属于Python层面的O(n²)迭代,1624维度下要执行两百多万次判断,耗时很高。直接用numpy向量化广播操作可以把运算下沉到C底层,性能提升几个数量级:
方案1:广播对比(最简洁)
import numpy as np import pandas as pd # 提取webshops列转为numpy数组 webshop_arr = df['webshops'].values # 利用广播直接做全量对比,转成整型0/1 dist_matrix = (webshop_arr[:, np.newaxis] == webshop_arr).astype(int) # 生成行列索引为产品名的结果矩阵 result_df = pd.DataFrame(dist_matrix, index=df['products'], columns=df['products'])
方案2:独热编码矩阵乘法(适合webshop分类非常多的场景)
import pandas as pd # 对webshops做独热编码 one_hot = pd.get_dummies(df['webshops']).values # 矩阵乘自身转置即可得到同店铺标记矩阵 dist_matrix = (one_hot @ one_hot.T).astype(int) result_df = pd.DataFrame(dist_matrix, index=df['products'], columns=df['products'])
性能说明
以n=1624的规模测试,上述两种方案的耗时都在10ms以内,远低于原始双层循环的数秒级耗时。
注意事项
如果products列存在重复值,结果矩阵的行列索引会重复,建议优先使用产品唯一ID作为索引避免歧义。
内容的提问来源于stack exchange,提问作者thomasb
相关产品推荐
相关产品推荐

