当我们想要计算矩阵的稀疏性时,.nonzero()[0]意味着什么?



我正在尝试通过阅读一篇博客来学习Python中的推荐系统,该博客包含一个在GitHub中创建存储库推荐系统的好例子。

使用read_csv()加载数据集后,编写代码的人决定将该数据转换为pivot_table pandas,以便以更简单的方式可视化数据。这里,为了简单起见,我给您留下了这部分代码的图像:

输入图片描述

在这个表中,行是用户,列是存储库。行和列之间的横截面是用户赋予特定存储库的标点符号。

由于该表中的许多元素都是空的(我们可以说我们有一个稀疏矩阵,这在机器学习中是很典型的),他决定通过下面的代码来研究矩阵的稀疏度:

ratings = df_matrix.values
sparsity = float(len(ratings.nonzero()[0]))
sparsity /= (ratings.shape[0] * ratings.shape[1])
sparsity *= 100
print('Sparsity: {:4.2f}%'.format(sparsity))

有没有人能告诉我第二行代码是什么意思?我认为我理解ratings.nonzero()返回一个列表,其中包含与零不同的所有元素的索引,并且由于我对总数而不是索引感兴趣,因此有必要使用len(ratings.nonzero()),但我的问题是我不可能知道代码中的[0]意味着什么。

非常感谢,给您带来的不便深表歉意!

默认情况下,nonzero将返回一个形式为(row_idxs, col_idxs)的元组。如果你给它一个一维数组(比如pandas序列),那么它仍然会返回一个元组(row_idxs,)。要访问第一个数组,我们仍然必须索引ratings.nonzero()[0]以获得非零元素的第一维索引。

nonzero的numpy页面上有更多信息,因为pandas和numpy使用相同的实现。

最新更新