Me gustaría tener la norma de una matriz NumPy. Más específicamente, estoy buscando una versión equivalente de esta función
def normalize(v):
norm = np.linalg.norm(v)
if norm == 0:
return v
return v / norm
¿Hay algo así en skearn
o numpy
?
Esta función funciona en una situación donde v
es el vector 0.
raise
una excepción!x/np.linalg.norm(x)
no era mucho más lento (alrededor del 15-20%) quex/np.sqrt((x**2).sum())
en Numpy 1.15.1 en una CPU.Respuestas:
Si usa scikit-learn, puede usar
sklearn.preprocessing.normalize
:fuente
normalize
requiere una entrada 2D. Puede pasar elaxis=
argumento para especificar si desea aplicar la normalización en las filas o columnas de su matriz de entrada.np.linalg.norm(x)
calcula la norma 'l2' por defecto. Si desea que la suma de su vector sea 1, debe usarnp.linalg.norm(x, ord=1)
ndarray
para que funcione con lanormalize()
función. De lo contrario, puede ser unlist
.Estoy de acuerdo en que sería bueno que tal función fuera parte de las baterías incluidas. Pero no lo es, que yo sepa. Aquí hay una versión para ejes arbitrarios y que ofrece un rendimiento óptimo.
fuente
Puede especificar ord para obtener la norma L1. Para evitar la división cero, uso eps, pero tal vez eso no sea genial.
fuente
[inf, 1, 2]
rendimientos[nan, 0, 0]
, pero ¿no debería ser así[1, 0, 0]
?Esto también podría funcionar para ti
pero falla cuando
v
tiene longitud 0.fuente
Si tiene datos multidimensionales y desea que cada eje se normalice a su máximo o su suma:
Utiliza la función numpys pico a pico .
fuente
También existe la función
unit_vector()
de normalizar vectores en el popular módulo de transformaciones de Christoph Gohlke:fuente
Usted mencionó el aprendizaje de sci-kit, así que quiero compartir otra solución.
kit de ciencia aprender
MinMaxScaler
En sci-kit learn, hay una API llamada
MinMaxScaler
que puede personalizar el rango de valores a su gusto.También se ocupa de los problemas de NaN para nosotros.
Muestra de código
El código es simple, solo escribe
Referenciafuente
Sin
sklearn
y usando solonumpy
. Simplemente defina una función :.Suponiendo que las filas son las variables y las columnas las muestras (
axis= 1
):salida:
fuente
Si desea normalizar n vectores de características dimensionales almacenados en un tensor 3D, también puede usar PyTorch:
fuente
Si está trabajando con vectores 3D, puede hacerlo de manera concisa usando el toolbelt vg . Es una capa ligera encima de numpy y admite valores individuales y vectores apilados.
Creé la biblioteca en mi último inicio, donde estaba motivada por usos como este: ideas simples que son demasiado detalladas en NumPy.
fuente
Si no necesita la máxima precisión, su función se puede reducir a:
fuente
Si trabaja con una matriz multidimensional, es posible una solución rápida.
Digamos que tenemos una matriz 2D, que queremos normalizar por el último eje, mientras que algunas filas tienen la norma cero.
fuente