2016-07-15 20 views
1

Betrachten Sie das folgende Beispiel:Wie eine scipy Zeilenmatrix in eine numpy Array konvertieren

import numpy as np 
import scipy.sparse 

A = scipy.sparse.csr_matrix((2,2)) 
b = A.sum(axis=0) 

Die Matrix b jetzt hat die Form

matrix([[ 0., 0.]]) 

aber ich möchte es sich um eine werden Array wie folgt:

array([ 0., 0.]) 

Dies kann durch b = np.asarray(b)[0] getan, aber das scheint nicht sehr ele gant, insbesondere im Vergleich zu MATLAB b(:). Gibt es einen eleganteren Weg, dies zu tun?

+2

Siehe http://stackoverflow.com/questions/26576524/how-do-i-transform-a-scipy-sparse-matrix-to-a-numpy-matrix; Beachten Sie insbesondere, dass die Sparse-Matrix über die Methode '.toarray()' verfügt, deren Ergebnis Sie in ein eindimensionales numpy-Array umformen können. –

+0

MATLABs 'b (:)' - was ist die Größe? Immer noch 2d ist es nicht? '(:)' ist ein bisschen wie 'np.ravel', außer MATLAB ist immer 2d oder höher. – hpaulj

Antwort

2

b.A1 wird die Arbeit machen.

In [83]: A 
Out[83]: 
<2x2 sparse matrix of type '<class 'numpy.float64'>' 
    with 0 stored elements in Compressed Sparse Row format> 

In [84]: A.A 
Out[84]: 
array([[ 0., 0.], 
     [ 0., 0.]]) 

In [85]: b=A.sum(axis=0) 

In [86]: b 
Out[86]: matrix([[ 0., 0.]]) 

In [87]: b.A1 
Out[87]: array([ 0., 0.]) 

In [88]: A.A.sum(axis=0)  # another way 
Out[88]: array([ 0., 0.]) 

Sie können diese abstimmen, oder hier meine Top-Einspielergebnis Antwort hinzufügen: Numpy matrix to array :)

A eine spärliche Matrix ist. Eine geringe Summe wird mit einem Matrixprodukt (einer geeigneten Matrix von 1s) durchgeführt. Das Ergebnis ist eine dichte Matrix.

Sparse-Matrix hat eine toarray()-Methode, mit einer .A Verknüpfung.

Dichte Matrix hat auch diese, aber es hat auch eine .A1 (schlecht dokumentiert - daher alle meine Hits), die auch flacht.

Der doc für A1:

Return `self` as a flattened `ndarray`. 
Equivalent to ``np.asarray(x).ravel()`` 

In der Tat ist der Code

return self.__array__().ravel() 

====================

Ist MATLAB b(:) wirklich das Äquivalent?

A (:) sind alle Elemente von A, betrachtet als eine einzelne Spalte.

Wenn ich das richtig gelesen habe, das numpy Äquivalent ist ein transponieren oder b.ravel().T. Die Form wäre (2,1). Aber in MATLAB ist eine Spaltenmatrix die einfachste Form der Matrix.

In [94]: b.T 
Out[94]: 
matrix([[ 0.], 
     [ 0.]]) 

(Ich bin ein alter MATLAB-Programmierer, mit Octave auf meinem Standby-Computer. Und eine Kopie von 3,5 auf einigen alten Windows-Datenträger. :)).

+1

In der Tat, entsprechend http://docs.scipy.org/doc/numpy/reference/generated/numpy.matrix.A1.html, entspricht .A1 "np.asarray (x) .ravel()", und scheint die prägnanteste Option zu sein. –

1

Hier gibt es verschiedene Optionen. Sie könnten zum Beispiel mit der Konvertierung der Matrix b in ein 2D-Array beginnen. Dann müssen Sie es in ein 1D-Array umwandeln. Dies kann leicht durch die NumPy erreicht werden squeeze oder reshape:

In [208]: np.asarray(b).squeeze() 
Out[208]: array([ 0., 0.]) 

In [209]: np.asarray(b).reshape((b.size,)) 
Out[209]: array([ 0., 0.]) 

Alternativ Sie A in ein Array umwandeln könnte wie in @Warren Weckesser Kommentar vorgeschlagen. Dies würde es unnötig machen weiter b konvertieren:

In [210]: A.toarray().sum(axis=0) 
Out[210]: array([ 0., 0.]) 
Verwandte Themen