In SciPy, utilizzando ix_ () con matrici sparse non sembra funzionare in modo che altro posso usare?

StackOverflow https://stackoverflow.com/questions/2338260

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?

È stato utile?

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]]
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top