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, oder?
Vielleicht klarer: Mit Normalisieren meine ich, die Summe der Einträge pro Zeile muss eins sein. Aber ich denke, das wird den meisten Menschen klar sein.
Rundfunk ist dafür wirklich gut:
row_sums = a.sum(axis=1)
new_matrix = a / row_sums[:, numpy.newaxis]
row_sums[:, numpy.newaxis]
formt Reihensummen von (3,)
in (3, 1)
um. Wenn Sie a / b
ausführen, werden a
und b
gegeneinander gesendet.
Mehr über Rundfunkerfahren Sie hier oder noch besser hier .
Scikit-learn verfügt über eine Normalisierungsfunktion, mit der Sie verschiedene Normalisierungen anwenden können. Die "machen Sie die Summe aus 1" ist die L1-Norm, und machen Sie das:
from sklearn.preprocessing import normalize
matrix = numpy.arange(0,27,3).reshape(3,3).astype(numpy.float64)
#array([[ 0., 3., 6.],
# [ 9., 12., 15.],
# [ 18., 21., 24.]])
normed_matrix = normalize(matrix, axis=1, norm='l1')
#[[ 0. 0.33333333 0.66666667]
#[ 0.25 0.33333333 0.41666667]
#[ 0.28571429 0.33333333 0.38095238]]
Jetzt werden Ihre Zeilen 1.
Ich denke das sollte funktionieren,
a = numpy.arange(0,27.,3).reshape(3,3)
a /= a.sum(axis=1)[:,numpy.newaxis]
Wenn Sie versuchen, jede Zeile so zu normalisieren, dass ihre Stärke Eins ist (d. H. Die Längeneinheit einer Zeile ist Eins oder die Summe des Quadrats jedes Elements in einer Zeile ist Eins)
import numpy as np
a = np.arange(0,27,3).reshape(3,3)
result = a / np.linalg.norm(a, axis=-1)[:, np.newaxis]
# array([[ 0. , 0.4472136 , 0.89442719],
# [ 0.42426407, 0.56568542, 0.70710678],
# [ 0.49153915, 0.57346234, 0.65538554]])
Überprüfung:
np.sum( result**2, axis=-1 )
# array([ 1., 1., 1.])
es scheint, dass dies auch funktioniert
def normalizeRows(M):
row_sums = M.sum(axis=1)
return M / row_sums
Oder mit der Lambda-Funktion wie
>>> vec = np.arange(0,27,3).reshape(3,3)
>>> import numpy as np
>>> norm_vec = map(lambda row: row/np.linalg.norm(row), vec)
jeder Vektor von vec wird eine Einheitsnorm haben.
Ich denke, Sie können die Zeilenelemente auf diese Weise auf 1 normalisieren: new_matrix = a / a.sum(axis=1, keepdims=1)
. Und die Spaltennormierung kann mit new_matrix = a / a.sum(axis=0, keepdims=1)
durchgeführt werden. Hoffe das kann hepen.
Sie können auch die Matrixumsetzung verwenden:
(a.T / row_sums).T