In SciPy, utilizzando ix_ () con matrici sparse non sembra funzionare in modo che altro posso usare?
-
22-09-2019 - |
Domanda
In Numpy, ix_ () viene utilizzato per afferrare righe e colonne di una matrice, ma non sembra funzionare con matrici sparse. Per esempio, questo codice funziona perché utilizza una fitta matrice:
>>> import numpy as np
>>> x = np.mat([[1,0,3],[0,4,5],[7,8,0]])
>>> print x
[[1 0 3]
[0 4 5]
[7 8 0]]
>>> print x[np.ix_([0,2],[0,2])]
[[1 3]
[7 0]]
ix_ () ho usato per indicizzare gli elementi corrispondenti ai 0TH e 2 righe e colonne che dà 4 angoli della matrice.
Il problema è che ix_ non sembra di lavorare con matrici sparse. Continuando dal codice precedente, provo il seguente:
>>> import scipy.sparse as sparse
>>> xspar = sparse.csr_matrix(x)
>>> print xspar
(0, 0) 1
(0, 2) 3
(1, 1) 4
(1, 2) 5
(2, 0) 7
(2, 1) 8
>>> print xspar[np.ix_([0,2],[0,2])]
e ottenere un messaggio di errore enorme dicendo che c'è questa eccezione:
File "C:\Python26\lib\site-packages\scipy\sparse\compressed.py", line 138, in check_format
raise ValueError('data, indices, and indptr should be rank 1')
ValueError: data, indices, and indptr should be rank 1
Ho provato questo con gli altri formati matrici sparse forniti da SciPy, ma nessuno di loro sembra funzionare con ix_ (), anche se non tutti sollevano la stessa eccezione.
L'esempio che ho dato usato una matrice che non era molto grande o molto scarsa, ma quelli che ho a che fare con sono piuttosto scarse e potenzialmente molto grande, quindi non sembra prudente elencare appena fuori dalla elementi uno per uno .
Qualcuno sa un modo (si spera facile) per fare questo tipo di indicizzazione con matrici sparse in SciPy o è questa caratteristica proprio non incorporata in queste matrici sparse?
Soluzione
Prova a modificare:
>>> print xspar
(0, 0) 1
(0, 2) 3
(1, 1) 4
(1, 2) 5
(2, 0) 7
(2, 1) 8
>>> print xspar[[[0],[2]],[0,2]]
(0, 0) 1
(0, 2) 3
(2, 0) 7
Si noti la differenza con questo:
>>> print xspar[[0,2],[0,2]]
[[1 0]]