如何高效构建用户-购买行为的N×K二进制矩阵?
将用户-商品字典转换为0-1矩阵
现有N个用户与K种可选商品,数据以字典形式存储:data[user] = [item1, item2, ...]。需将该字典转换为N×K矩阵,其中(n,k)位置元素为1表示用户n购买过商品k,否则为0。示例数据生成代码如下:
import random random.seed(10) # 用户列表 N = list(range(10)) # 商品列表(用整数表示) K = list(range(1000)) # 生成用户-商品字典,每个用户的商品数量随机 data = {x:random.sample(K, random.randint(1,50)) for x in N}
方法1:NumPy密集矩阵(小数据量适用)
直接初始化全0矩阵,遍历用户填充对应位置为1:
import numpy as np num_users = len(N) num_items = len(K) # 创建N×K的全0整数APIown在%emen告知居中 value arribarant发展Review完成7矩阵 matrix = np.zeros((num_users, num_items), dtype=int) for user_idx, user in enumerate(N): # 取出当前用户的所有商品 user_items = data[user] # 对应列位置设为1(这里商品ID本身就是列索引) matrix[user_idx, user_items] = 1
方法2:Pandas DataFrame(带标签展示)
如果需要保留用户和商品的标签信息,用DataFrame更直观:
import pandas as pd # 先把用户的商品列表转成集合,加快判断速度 user_item_sets = {user: set(items) for user, items in data.items()} # 初始化DataFrame,行是用户,列是商品 df_matrix = pd.DataFrame(index=N, columns=K) # 逐行填充 for user in N: df_matrix.loc[user] = [1 if item in user_item_sets[user] else 0 for item in K]
方法3:SciPy稀疏矩阵(大数据量推荐)
当用户或商品数量极大时,密集矩阵会占用过多内存,稀疏矩阵仅存储非零元素,大幅节省空间:
from scipy.sparse import csr_matrix row_ids = [] col_ids = [] values = [] for row_idx, user in enumerate(N): for item in data[user]: row_ids.append(row_idx) col_ids.append(item) values.append(1) # 构建CSR格式的稀疏矩阵 sparse_matrix = csr_matrix((values, (row_ids, col_ids)), shape=(len(N), len(K))) # 若需转换为密集矩阵(仅小数据量建议使用) # dense_matrix = sparse_matrix.toarray()
内容的提问来源于stack exchange,提问作者statsman
相关产品推荐
相关产品推荐

