如何有效地加载稀疏矩阵?

2024-10-02 12:26:55 发布

您现在位置:Python中文网/ 问答频道 /正文

给定具有此结构的文件:

  • 单列线是键
  • 键的非零值

例如:

abc
ef 0.85
kl 0.21
xyz 0.923
cldex 
plax 0.123
lion -0.831

如何创建稀疏矩阵csr_matrix

^{pr2}$

我试过了:

from collections import defaultdict

x = """abc
ef  0.85
kl  0.21
xyz 0.923
cldex 
plax    0.123
lion    -0.831""".split('\n')

k1 = ''
arr = defaultdict(dict)
for line in x:
    line = line.strip().split('\t')
    if len(line) == 1:
        k1 = line[0]
    else:
        k2, v = line
        v = float(v)
        arr[k1][k2] = v

[出去]

>>> arr
defaultdict(dict,
            {'abc': {'ef': 0.85, 'kl': 0.21, 'xyz': 0.923},
             'cldex': {'plax': 0.123, 'lion': -0.831}})

嵌套dict结构不像scipy稀疏矩阵结构那样方便。在

有没有一种方法可以轻松地将上述给定格式的文件读入scipy稀疏矩阵对象中?


Tags: 文件line矩阵k1结构dictabcarr
3条回答

目前,在0.23版本中,pandas已经实现了序列和数据帧的稀疏版本。巧合的是,您的数据可以看作是一个具有多级索引的序列,因此您可以利用这个事实来构建稀疏矩阵。此外,如果格式一致,可以使用几行panda来读取格式,例如:

import numpy as np
import pandas as pd
from io import StringIO

lines = StringIO("""abc
ef  0.85
kl  0.21
xyz 0.923
cldex
plax    0.123
lion    -0.831""")

# load Series
s = pd.read_csv(lines, delim_whitespace=True, header=None, names=['k', 'v'])
s = s.assign(k2=pd.Series(np.where(np.isnan(s.v), s.k, np.nan)).ffill())
result = s[~np.isnan(s.v)].set_index(['k2', 'k']).squeeze()

# convert to sparse matrix (csr)
ss = result.to_sparse()
coo, rows, columns = ss.to_coo(row_levels=['k'], column_levels=['k2'], sort_labels=True)
print(coo.tocsr())

输出

^{pr2}$

to_coo方法不仅返回矩阵,还返回列和行标签,因此还执行逆映射。在上面的示例中,返回以下内容:

['ef', 'kl', 'lion', 'plax', 'xyz']
['abc', 'cldex']

其中'ef'对应于行的索引0,而{}对应于列的索引0。在

将@hpaulj的注释转换为answer,可以迭代地添加到行和列索引的列表中。将这些

from scipy import sparse
import numpy as np
import pandas as pd

rows, cols, values = [], [], []
for line in x.splitlines():
   if ' ' not in line.strip():
       ridx = line
   else:
       cidx, value = line.strip().split()       
       rows.append(ridx)
       cols.append(cidx)
       values.append(value)

rows, rinv = pd.factorize(rows)
cols, cinv = pd.factorize(cols)

sp = sparse.coo_matrix((values, (rows, cols)), dtype=np.float32)
# sp = sparse.csr_matrix((np.array(values, dtype=np.float), (rows, cols)))

^{pr2}$

如果需要,可以使用rinvcinv执行反向映射(将索引转换为字符串)。在

既然你有口述

dox = {'abc': {'ef': 0.85, 'kl': 0.21, 'xyz': 0.923},'cldex': {'plax': 0.123, 'lion': -0.831}}

这将有助于您将其带到sparsematrix:

^{pr2}$

它利用scipy的example进行增量矩阵构建。输出如下:

mat.todense()

enter image description here

相关问题 更多 >

    热门问题