it-swarm.com.de

Wie normalisiert man ein 2-dimensionales numpy-Array in Python weniger ausführlich?

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.

71
Aufwind

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 .

108
Bi Rico

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.

75
rogueleaderr

Ich denke das sollte funktionieren,

a = numpy.arange(0,27.,3).reshape(3,3)

a /=  a.sum(axis=1)[:,numpy.newaxis]
8
tom10

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.]) 
3
walt

es scheint, dass dies auch funktioniert

def normalizeRows(M):
    row_sums = M.sum(axis=1)
    return M / row_sums
1
Jamesszm

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.

0
XY.W

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.

0
Fanwang Meng

Sie können auch die Matrixumsetzung verwenden:

(a.T / row_sums).T
0
Maciek