2017-02-05 2 views
0

Ich habe folgende numpy matrix:Iterieren über numpy Matrixspalten

 0  1  2  3  4  5  6  7  8  9  
0  0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
1  0.0 0.0 5.0 0.0 9.0 0.0 0.0 0.0 0.0 0.0 
2  0.0 0.0 0.0 0.0 0.0 0.0 2.0 0.0 0.0 0.0 
3  0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 0.0 
4  0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
5  0.0 0.0 7.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 
6  0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
7  5.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 0.0 0.0 
8  2.0 0.0 0.0 0.0 3.0 0.0 6.0 0.0 8.0 0.0 
9  0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
10  0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 

Ich will die Nicht-Null-Wert durchschnittlich jede Zeile und Spalte separat berechnen. So soll mein Ergebnis so etwas wie diese:

average_rows = [1.0,7.0,2.0,5.0,0.0,4.0,0.0,5.5,4.75,1.0,0.0] 
average_cols = [3.5,1.0,4.33333,0.0,4.33333,0.0,4.0,6.0,6.5,0.0] 

Ich kann nicht herausfinden, wie über sie zu durchlaufen, und ich bekomme immer wieder TypeError: unhashable type

Auch bin ich nicht sicher, ob das Iterieren die beste Lösung , Versuchte ich auch etwas wie R[:,i], um jede Spalte zu ergreifen und es unter Verwendung sum(R[:,i]) zu summieren, aber behalten Sie den gleichen Fehler.

+0

Wie haben Sie diese übersichtliche Tabellenanzeige erhalten? Es ist nicht normal "numpig". Mit Zeilen- und Spaltenbezeichnungen sieht es aus wie 'Pandas'. Was ** genau ** meinst du mit 'Matrix'? – hpaulj

+0

Es ist numpy. Ich beginne mit 'R = np.zeros ((Rrows, Rcols))', dann iteriert und füllt die Nicht-Null-Werte auf, es ist meist eine dünne Matrix. Es könnte schön angezeigt werden, da ich ipython notebook verwende. – BKS

+0

Ok, ich benutze Ipython alle, aber nicht das Notebook. Aber wenn das das "R" ist, sehe ich nicht, wo der "nicht hashable" Fehler herkommt. Wenn Sie Fehler melden, sollten Sie mindestens einen Teil des Fehlerstapels und die Codezeile anzeigen, die ihn erzeugt hat. – hpaulj

Antwort

1

Es ist besser, 2d np.array anstelle von Matrix zu verwenden.

import numpy as np 
data = np.array([[1, 2, 0], [0, 0, 1], [0, 2, 4]], dtype='float') 
data[data == 0] = np.nan 
# replace all zeroes with `nan`'s to skip them 
# [[ 1. 2. nan] 
# [ nan nan 1.] 
# [ nan 2. 4.]] 
np.nanmean(data, axis=0) 
# array([ 1. , 2. , 2.5]) 
np.nanmean(data, axis=1) 
# array([ 1.5, 1. , 3. ]) 
+0

Es ist eine große Matrix, die ich habe (9.000 x 15.000). Und ich bin nicht sicher, wie man es in ein np.array ändert. – BKS

+0

Füttern Sie es einfach zu 'np.array':' np.array (np.matrix ([[1, 2, 3], [4, 5, 6]])) '. 'np.array' ist vollkommen in Ordnung, um mit großen 2D-Arrays zu arbeiten. –

+0

Der einzige Grund, warum 'np.matrix' existiert, ist sein Verhalten mit dem Operator' * ': Er führt eine Matrixmultiplikation statt elementweise für' np.matrix' durch. Aber jetzt haben wir '@' zu tun, Matrix-Multiplikation, so dass wir 'np.matrix' überhaupt nicht brauchen. –