我使用np.save('X', X)
保存了一个scipy csr矩阵。当我用np.load('X.npy')
加载它时,我得到了这个签名:
array(<240760x110493 sparse matrix of type '<class 'numpy.float64'>'
with 20618831 stored elements in Compressed Sparse Row format>, dtype=object)
但是,我无法使用索引(例如X[0,0]
或X[:10,:10] or X[0]
提供错误IndexError: too many indices for array
)来访问此数据,并且调用.shape
会返回()
。
有没有办法访问这些数据,或者它现在是否已损坏?
由于有3个保存/加载矩阵的选项,我进行了速度比较,看看哪种方法最适合我的稀疏矩阵:
%timeit -n1 scipy.io.savemat('tt', {'t': X})
1 loops, best of 3: 66.3 ms per loop
timeit -n1 scipy.io.mmwrite('tt_mm', X)
1 loops, best of 3: 7.55 s per loop
timeit -n1 np.save('tt_np', X)
1 loops, best of 3: 188 ms per loop
timeit -n1 scipy.io.loadmat('tt')
1 loops, best of 3: 9.78 ms per loop
%timeit -n1 scipy.io.mmread('tt_mm')
1 loops, best of 3: 5.72 s per loop
%timeit -n1 np.load('tt_np.npy')
1 loops, best of 3: 150 ms per loop
结果是mmread/mmwrite
非常低(约慢100倍),而savemat/loadmat
比save/load
快3-10倍。
答案 0 :(得分:2)
让我们留意印刷品中的所有线索
array(<240760x110493 sparse matrix of type '<class 'numpy.float64'>'
with 20618831 stored elements in Compressed Sparse Row format>, dtype=object)
最外层:
array(....,dtype=object)
稀疏矩阵不是常规数组;到np.save
,它只是一个Python对象。因此它将其包裹在dtype=object
中并保存。它是一个0d数组(因此是()
形状),因此所有索引尝试都失败了。尝试改为
M=arr.item() # or
M=arr[()]
现在M
应显示为:
sparse matrix of type '<class 'numpy.float64'>'
with 20618831 stored elements in Compressed Sparse Row format
包含M.shape
等属性。 M.A
将显示密集形式,因为它太大而无法有效地执行此操作。