从csv文件导入稀疏矩阵

时间:2014-06-26 08:52:21

标签: python csv numpy scipy sparse-matrix

我有一个csv文件,标题如下:

鉴于此test.csv文件包含sparse matrix

"A","B","C","D","E","F","timestamp"
611.88243,0,0,0,0,0,0
0,9089.5601,0,864.07514,0,0,0
0,0,5133.0,0,0,0,0

我只想将其作为稀疏矩阵/ ndarray加载3行和7列。 如果,我使用load.txt然后我得到3行和7列的数组。

numpy.loadtxt(open("test.csv","rb"),delimiter=",",skiprows=1)

现在,我的文件实际上很大,有10,000列和7000行。因此,加载需要花费大量时间。 scipy/numpy中是否有任何有效的方法将矩阵作为稀疏矩阵或数组加载,因此利用稀疏特征可以减少加载时间?

1 个答案:

答案 0 :(得分:0)

我在你的数据上测试了这个裸骨loadtxt(复制产生一个(39,7)数组):

def my_loadtxt(file):
    # barebones loadtxt
    f = open(file)
    h = f.readline()
    ll = []
    for l in f:
        y = [float(x) for x in l.split(',')]
        ll.append(y)
    x = np.array(ll)
    f.close()
    return x

它只是np.loadtxt的2倍。

该结果可以变成稀疏的矩阵,例如sparse.csr_matrix(loadtext(...))。但是这一步不会随时节省。

可以想象,我的函数中的数据行y可以变成稀疏矩阵,然后将其收集到一个大的稀疏矩阵中。但是,必须要有scipy.sparse矩阵类型的良好知识才能有效地完成这项工作。我对它节省时间并不乐观。


如果你只想加载一次或很少加载这个文件,你只需要使用' loadtxt'或简化版,并接受时间成本。但是如果你必须经常加载它,那么以更有效的形式保存它可能是值得的。

你可以尝试简单的numpy保存和加载(虽然在我的测试中这个更慢)。

scipy.io中的一些格式可以保存sparse矩阵。例如matlab兼容格式:

io.savemat('stack24426239.mat',{'x2':sparse.csr_matrix(x1)})
x2 = io.loadmat('stack24426239.mat')['x2']

在我的小测试中,此loadmatmy_loadtxt快一点。我不知道它将如何在更大的文件上运行。 ' .mat'也比' .txt'小一点。