Je voudrais avoir la norme d'un tableau NumPy. Plus précisément, je recherche une version équivalente de cette fonction
def normalize(v):
norm = np.linalg.norm(v)
if norm == 0:
return v
return v / norm
Y a-t-il quelque chose comme ça dans skearn
ou numpy
?
Cette fonction fonctionne dans une situation où v
est le vecteur 0.
raise
une exception!x/np.linalg.norm(x)
n'était pas beaucoup plus lent (environ 15-20%) quex/np.sqrt((x**2).sum())
dans numpy 1.15.1 sur un CPU.Réponses:
Si vous utilisez scikit-learn, vous pouvez utiliser
sklearn.preprocessing.normalize
:la source
normalize
nécessite une entrée 2D. Vous pouvez passer l'axis=
argument pour spécifier si vous souhaitez appliquer la normalisation sur les lignes ou les colonnes de votre tableau d'entrée.np.linalg.norm(x)
calcule la norme 'l2' par défaut. Si vous voulez que la somme de votre vecteur soit 1, vous devez utilisernp.linalg.norm(x, ord=1)
ndarray
pour qu'il fonctionne avec lanormalize()
fonction. Sinon, cela peut être unlist
.Je conviendrais que c'était bien si une telle fonction faisait partie des piles incluses. Mais ce n'est pas, autant que je sache. Voici une version pour axes arbitraires, et offrant des performances optimales.
la source
Vous pouvez spécifier ord pour obtenir la norme L1. Pour éviter la division zéro, j'utilise eps, mais ce n'est peut-être pas génial.
la source
[inf, 1, 2]
rendements[nan, 0, 0]
, mais cela ne devrait pas être le cas[1, 0, 0]
?Cela pourrait également fonctionner pour vous
mais échoue quand
v
a la longueur 0.la source
Si vous avez des données multidimensionnelles et souhaitez que chaque axe soit normalisé à son maximum ou à sa somme:
Utilise la fonction crête à crête de numpys .
la source
Il y a aussi la fonction
unit_vector()
de normalisation des vecteurs dans le module de transformations populaires de Christoph Gohlke:la source
Vous avez mentionné sci-kit learn, donc je veux partager une autre solution.
sci-kit apprendre
MinMaxScaler
Dans sci-kit learn, il existe une API appelée
MinMaxScaler
qui peut personnaliser la plage de valeurs comme vous le souhaitez.Il traite également des problèmes de NaN pour nous.
Exemple de code
Le code est simple, il suffit de taper
Référencela source
Sans
sklearn
et en utilisant justenumpy
. Définissez simplement une fonction :.En supposant que les lignes sont les variables et les colonnes les échantillons (
axis= 1
):production:
la source
Si vous souhaitez normaliser des vecteurs d'entités à n dimensions stockés dans un tenseur 3D, vous pouvez également utiliser PyTorch:
la source
Si vous travaillez avec des vecteurs 3D, vous pouvez le faire de manière concise à l'aide de la ceinture d'outils vg . C'est une couche légère au-dessus de numpy et elle prend en charge les valeurs uniques et les vecteurs empilés.
J'ai créé la bibliothèque lors de mon dernier démarrage, où elle était motivée par des utilisations comme celle-ci: des idées simples qui sont beaucoup trop verbeuses dans NumPy.
la source
Si vous n'avez pas besoin d'une précision extrême, votre fonction peut être réduite à:
la source
Si vous travaillez avec un tableau multidimensionnel, une solution rapide est possible.
Disons que nous avons un tableau 2D, que nous voulons normaliser par le dernier axe, tandis que certaines lignes ont une norme nulle.
la source