我有一个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
中是否有任何有效的方法将矩阵作为稀疏矩阵或数组加载,因此利用稀疏特征可以减少加载时间?
答案 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']
在我的小测试中,此loadmat
比my_loadtxt
快一点。我不知道它将如何在更大的文件上运行。 ' .mat'也比' .txt'小一点。