Gegeben ein 3 mal 3 numpy Array
a = numpy.arange(0,27,3).reshape(3,3)
# array([[ 0, 3, 6],
# [ 9, 12, 15],
# [18, 21, 24]])
Um die Zeilen des zweidimensionalen Arrays zu normalisieren, dachte ich daran
row_sums = a.sum(axis=1) # array([ 9, 36, 63])
new_matrix = numpy.zeros((3,3))
for i, (row, row_sum) in enumerate(zip(a, row_sums)):
new_matrix[i,:] = row / row_sum
Es muss einen besseren Weg geben, nicht wahr?
Vielleicht zur Verdeutlichung: Mit Normalisierung meine ich, dass die Summe der Einträge pro Zeile eins sein muss. Aber ich denke, das wird den meisten Menschen klar sein.
Antworten:
Der Rundfunk ist dafür wirklich gut:
row_sums[:, numpy.newaxis]
formt row_sums von Sein(3,)
zu Sein um(3, 1)
. Wenn Sie das tuna / b
,a
undb
sind gegeneinander ausgestrahlt.Sie können erfahren Sie mehr über Rundfunk hier oder noch besser hier .
quelle
a.sum(axis=1, keepdims=True)
die Dimension der Singleton-Spalte beibehalten wird, die Sie dann ohne Verwendung mitsenden könnennp.newaxis
.np.linalg.norm
stattdessena.sum
!row_sums.reshape(3,1)
?Scikit-learn verfügt über eine Normalisierungsfunktion, mit der Sie verschiedene Normalisierungen anwenden können. Die "Summe auf 1 bringen" ist die L1-Norm, und um das zu tun, tun Sie Folgendes:
Jetzt summieren sich Ihre Zeilen zu 1.
quelle
Ich denke das sollte funktionieren,
quelle
Wenn Sie versuchen, jede Zeile so zu normalisieren, dass ihre Größe eins ist (dh die Einheitslänge einer Zeile ist eins oder die Summe des Quadrats jedes Elements in einer Zeile ist eins):
Überprüfen:
quelle
Ich denke, Sie können die Summe der Zeilenelemente auf 1 normalisieren, indem Sie :
new_matrix = a / a.sum(axis=1, keepdims=1)
. Und die Spaltennormalisierung kann mit durchgeführt werdennew_matrix = a / a.sum(axis=0, keepdims=1)
. Hoffe das kann hep.quelle
Sie können die integrierte Numpy-Funktion verwenden:
np.linalg.norm(a, axis = 1, keepdims = True)
quelle
es scheint, dass dies auch funktioniert
quelle
Sie können auch die Matrixtransposition verwenden:
quelle
Oder mit Lambda-Funktion, wie
Jeder Vektor von vec hat eine Einheitsnorm.
quelle
Dabei ist input_data der Name Ihres 2D-Arrays
quelle