从一开始就使用一元/二进制数据创建一个 csr_matrix

Posted

技术标签:

【中文标题】从一开始就使用一元/二进制数据创建一个 csr_matrix【英文标题】:Creating a csr_matrix with unary/binary data from the start 【发布时间】:2019-11-18 22:23:54 【问题描述】:

我从包含UserIdItemId 列的pandas Dataframe 中的SQL 导入二进制数据。我正在使用隐式/二进制数据,您可以在下面的 pivot_table 中看到。

Dummy data

frame=pd.DataFrame()
frame['Id']=[2134, 23454, 5654, 68768]
frame['ItemId']=[123, 456, 789, 101]

我知道如何在 Pandas 中使用以下方法创建 pivot_table

print(frame.groupby(['Id', 'ItemId'], sort=False).size().unstack(fill_value=0))

ItemId  123  456  789  101
Id
2134      1    0    0    0
23454     0    1    0    0
5654      0    0    1    0
68768     0    0    0    1

并将其转换为 SciPy csr_matrix,但我想从一开始就创建一个稀疏矩阵,而不必从 Pandas df 转换。原因是我收到一个错误:Unstacked DataFrame is too big, causing int32 overflow,因为我的原始数据由378.777 行组成。

非常感谢任何帮助!

我正在尝试与这些答案相同Efficiently create sparse pivot tables in pandas?

但我还没有frame['count'] 数据。

【问题讨论】:

您是否期望数据中有重复项,即可以有多个元组,例如(2134, 123) 发生?或者它们肯定是独一无二的? 我的数据中没有重复项 【参考方案1】:

使用4th option 实例化矩阵:

Id = [2134, 23454, 5654, 68768]
ItemId = [123, 456, 789, 101]

csrm = csr_matrix(([1]*len(Id), (Id,ItemId)))

结果:

<68769x790 sparse matrix of type '<class 'numpy.int32'>'
    with 4 stored elements in Compressed Sparse Row format>

【讨论】:

【参考方案2】:

我假设您可以以某种方式将数据值的行读取到内存中的单独列表中,即,就像您在示例中所做的那样(具有 IdItemId 的列表)。根据您帖子上的 cmets,我们也不希望重复。请注意,如果您有重复,以下将不起作用

所提出的解决方案还引入了一个(稀疏)矩阵,它不像示例中所示那样密集,因为我们将直接使用 Id 值作为矩阵/行条目。

要将它们传递给构造函数,如果您正在查看SciPy documentation:

csr_matrix((data, (row_ind, col_ind)), [shape=(M, N)])

其中datarow_indcol_ind 满足关系a[row_ind[k], col_ind[k]] = data[k]

意味着我们可以直接将列表作为索引传递给我们的稀疏矩阵,如下所示:

from scipy.sparse import csr_matrix
Id_values = load_values() # gets the list of entries as in the post example
ItemId_values = load_more_values()

sparse_mat = csr_matrix(([1]*len(Id_values), # entries will be filled with ones
                        (Id_values, ItemId_values)), # at those positions
                        shape=(max(Id_values)+1, max(ItemId_values)+1)) # shape is the respective maximum entry of each dimension

请注意,这不会给您任何排序,而是将值放在它们各自的 Id 位置,即第一对将保存在位置 (2134, 134) 而不是 (0, 0)

【讨论】:

非常有趣! Id*Items 的组合(因此稀疏矩阵中的位置)永远不会重复,但是有重复的 Ids 和重复的项目。据我了解,这不是问题吗? 没错!它基本上进入不同的行/列位置。这就是我询问重复项的原因;-)

以上是关于从一开始就使用一元/二进制数据创建一个 csr_matrix的主要内容,如果未能解决你的问题,请参考以下文章

如何从一开始就创建自定义的 drupal cms

“val_acc”根本没有改变

Day 1 线性表之顺序存储

故事板中的红线从一开始就添加了所有控件——Xcode 6.3

Obj-C 应用程序不会从一开始就加载

使用 Keras 进行迁移学习,验证准确度从一开始就没有提高(超出原始基线),而训练准确度提高了