加载用 np.save 保存的稀疏矩阵

ant*_*ell 3 python numpy matrix scipy

我使用保存了 scipy csr 矩阵np.save('X', X)。当我加载它时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]全部给出 error IndexError: too many indices for array)并调用.shapereturns来访问此数据()

有没有办法访问这些数据,或者它现在是否已损坏?

编辑。

由于有 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
Run Code Online (Sandbox Code Playgroud)

读取稀疏矩阵:

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
Run Code Online (Sandbox Code Playgroud)

结果是mmread/mmwrite令人难以置信的低(大约慢 100 倍),并且savemat/loadmatsave/load.

hpa*_*ulj 5

让我们关注打印中的所有线索

array(<240760x110493 sparse matrix of type '<class 'numpy.float64'>'
     with 20618831 stored elements in Compressed Sparse Row format>, dtype=object)
Run Code Online (Sandbox Code Playgroud)

最外层:

array(....,dtype=object)
Run Code Online (Sandbox Code Playgroud)

稀疏矩阵不是规则数组;to np.save,它只是一个Python对象。所以它把它包裹在 a 中dtype=object并保存了它。它是一个 0d 数组(因此是()形状),因此所有索引尝试都会失败。尝试一下

M=arr.item() # or
M=arr[()]
Run Code Online (Sandbox Code Playgroud)

现在M应该显示为:

sparse matrix of type '<class 'numpy.float64'>'
     with 20618831 stored elements in Compressed Sparse Row format
Run Code Online (Sandbox Code Playgroud)

具有诸如M.shape. M.A将显示密集形式,但它太大而无法有效执行此操作。