skimage array python arrays syntax numpy normalization

python - array - numpy normalize matrix



¿Cómo normalizar una matriz numpy bidimensional en python menos detallada? (7)

Creo que esto debería funcionar,

a = numpy.arange(0,27.,3).reshape(3,3) a /= a.sum(axis=1)[:,numpy.newaxis]

Dada una matriz numpy 3 veces 3

a = numpy.arange(0,27,3).reshape(3,3) # array([[ 0, 3, 6], # [ 9, 12, 15], # [18, 21, 24]])

Para normalizar las filas de la matriz bidimensional pensé en

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

Debe haber una mejor manera, ¿no?

Tal vez para aclarar: Al normalizar, quiero decir, la suma de las entradas por fila debe ser una. Pero creo que eso será claro para la mayoría de la gente.


En caso de que intente normalizar cada fila de tal manera que su magnitud sea uno (es decir, la longitud de una unidad de una fila es uno o la suma del cuadrado de cada elemento de una fila es uno):

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]])

Verificando:

np.sum( result**2, axis=-1 ) # array([ 1., 1., 1.])


La radiodifusión es realmente buena para esto:

row_sums = a.sum(axis=1) new_matrix = a / row_sums[:, numpy.newaxis]

row_sums[:, numpy.newaxis] reconfigura row_sums de ser (3,) a ser (3, 1) . Cuando haces a / b , a y b se transmiten uno contra el otro.

Puede obtener más información sobre la transmisión here o incluso mejor here .


O usando la función lambda, como

>>> vec = np.arange(0,27,3).reshape(3,3) >>> import numpy as np >>> norm_vec = map(lambda row: row/np.linalg.norm(row), vec)

cada vector de vec tendrá una norma de unidad.


Scikit-learn tiene una función de normalización que le permite aplicar varias normalizaciones. El "haz que sume a 1" es la norma L1, y para que lo hagas:

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]]

Ahora sus filas sumarán a 1.


También podría usar la transposición matricial:

(a.T / row_sums).T


parece que esto también funciona

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