为什么 scipy.sparse_matrix 不直接接受来自数据帧的值?

问题描述 投票:0回答:1

我创建了一个运行良好的 scipy 稀疏矩阵

X = csr_matrix(
    (df["rating"], (item_idx, user_idx)), 
    shape=(M, N)
)

但要简化哪里(大致相当)

item_idx ~= df[item_id]

我执行以下操作

csr_matrix(
    (df["points"], 
    (df["user_id"], df["item_id"])])), 
    shape=(N, M)
)

返回有关稀疏矩阵的索引和大小的错误。请注意,即使“id”恰好映射到唯一名称的数量,也会发生此错误。

ValueError: axis 0 index 99 exceeds matrix dimension 97

任何人都可以帮助我理解为什么当只有值的顺序发生变化时会在这里返回索引错误?范围是一致的。这和稀疏性有关系吗?

MRE:

df = pd.DataFrame({
    "user_id": np.random.randint(0, 75, 300),
    "item_id": np.random.randint(0, 100, 300),
    "rating": np.random.randint(0, 10, 300)
})


def mappings(df, user_id, item_id):
    user_id_idx_mapping = dict(zip( df[user_id].unique(), range(df[user_id].nunique()) ))
    user_idx_id_mapping = dict(zip( range(df[user_id].nunique()), df[user_id].unique() ))

    item_id_idx_mapping = dict(zip( df[item_id].unique(), range(df[item_id].nunique()) ))
    item_idx_id_mapping = dict(zip( range(df[item_id].nunique()), df[item_id].unique() ))

    return user_id_idx_mapping, user_idx_id_mapping, item_id_idx_mapping, item_idx_id_mapping

user_id_idx_mapping, user_idx_id_mapping, item_id_idx_mapping, item_idx_id_mapping = mappings(df, "user_id", "item_id")

N = df["user_id"].nunique()
M = df["item_id"].nunique()

user_idx = [user_id_idx_mapping[int(j)] for j in df["user_id"]]
item_idx = [item_id_idx_mapping[int(l)] for l in df["item_id"]]    

true = dict(zip([int(k) for k in list(df["user_id"].values)], user_idx))

X_works = csr_matrix(
    (df["rating"], (item_idx, user_idx)), 
    shape=(M, N)
)

X_doesnt = csr_matrix(
    (df["rating"], (df["item_id"], df["user_id"])), 
    shape=(M, N)
)

print(true)
python scipy
1个回答
0
投票

形状需要大于最高索引(数据框中的值)。您收到错误消息

ValueError: axis 0 index 99 exceeds matrix dimension 97

因为

item_id
列的值为 99,但
M
的值为 97

print(M, N)
print(max(item_idx), max(user_idx))
print(max(df["item_id"]), max(df["user_id"]))
    
Output:

96 75
95 74
99 74

您需要确保形状足够大。一种选择(不确定这是否是您正在寻找的)是取

(M, N)
和列中的值之间的最大值

shape = max(M, max(df["item_id"])+1), max(N, max(df["user_id"])+1)
© www.soinside.com 2019 - 2024. All rights reserved.