Scipy 稀疏矩阵作为 DataFrame 列
Scipy sparse matrix as DataFrame column
我正在开发基于 pandas DataFrame 对象的工具。我想将 scipy 稀疏矩阵保留为 DataFrame 的列,而不将其逐行转换为 dtype('O').
的列表/numpy 数组
下面的代码片段不起作用,因为 pandas 将矩阵视为标量,并建议添加索引。当在矩阵中的行索引上提供 pd.RangeIndex 时,矩阵会为数据帧中的每一行重复(因为 pandas 认为它是标量)。
ma = scipy.sparse.rand(10, 100, 0.1, 'csr', dtype=np.float64)
df = pd.DataFrame(dict(X=ma))
这确实有效:
df = pd.DataFrame(dict(X=list(ma)))
但是,这会将矩阵逐行切割成 CSR 矩阵,每行 1 行。每次我想在原始矩阵上工作时,我都需要 vstack。
有什么指点吗?我尝试将 CSR 矩阵包装到一个 pd.Series 对象中,假装它具有 dtype('O'),但我 运行 对底层数据的许多假设是 numpy 数组等。
存在稀疏数据框或数据系列功能。它仍然是实验性的。我已经回答了一些关于在 scipy
稀疏矩阵之间来回转换的问题。
来自边栏:
如果没有这种专门的 pandas 结构,我看不出如何将稀疏矩阵添加到 pandas 框架中。稀疏矩阵的内部结构差异太大。首先,它不是 numpy 数组的子类。
csr
矩阵是一个对象,其数据包含在 3 个数组中,ma.data
和 ma.indices
是一维数组,数组的每个非零元素都有一个值。 ma.indptr
矩阵的每一行都有一个值。
list(ma)
没有意义。 ma.toarray()
生成一个具有相同数据的二维数组,所有这些零也将被填充。
其他稀疏矩阵格式将其数据存储在其他结构中 - coo
的 3 个等长数组,lil
的两个列表列表和 dok
的字典。
诚然,这并不能准确回答您的问题,但如果有人正在寻找快速解决方法,并且不介意将矩阵低效地存储为密集矩阵,可以这样做:
df = pd.DataFrame(X=ma.todense().tolist())
我正在开发基于 pandas DataFrame 对象的工具。我想将 scipy 稀疏矩阵保留为 DataFrame 的列,而不将其逐行转换为 dtype('O').
的列表/numpy 数组下面的代码片段不起作用,因为 pandas 将矩阵视为标量,并建议添加索引。当在矩阵中的行索引上提供 pd.RangeIndex 时,矩阵会为数据帧中的每一行重复(因为 pandas 认为它是标量)。
ma = scipy.sparse.rand(10, 100, 0.1, 'csr', dtype=np.float64)
df = pd.DataFrame(dict(X=ma))
这确实有效:
df = pd.DataFrame(dict(X=list(ma)))
但是,这会将矩阵逐行切割成 CSR 矩阵,每行 1 行。每次我想在原始矩阵上工作时,我都需要 vstack。
有什么指点吗?我尝试将 CSR 矩阵包装到一个 pd.Series 对象中,假装它具有 dtype('O'),但我 运行 对底层数据的许多假设是 numpy 数组等。
存在稀疏数据框或数据系列功能。它仍然是实验性的。我已经回答了一些关于在 scipy
稀疏矩阵之间来回转换的问题。
来自边栏:
如果没有这种专门的 pandas 结构,我看不出如何将稀疏矩阵添加到 pandas 框架中。稀疏矩阵的内部结构差异太大。首先,它不是 numpy 数组的子类。
csr
矩阵是一个对象,其数据包含在 3 个数组中,ma.data
和 ma.indices
是一维数组,数组的每个非零元素都有一个值。 ma.indptr
矩阵的每一行都有一个值。
list(ma)
没有意义。 ma.toarray()
生成一个具有相同数据的二维数组,所有这些零也将被填充。
其他稀疏矩阵格式将其数据存储在其他结构中 - coo
的 3 个等长数组,lil
的两个列表列表和 dok
的字典。
诚然,这并不能准确回答您的问题,但如果有人正在寻找快速解决方法,并且不介意将矩阵低效地存储为密集矩阵,可以这样做:
df = pd.DataFrame(X=ma.todense().tolist())