[PYTHON] Élevez la dimension avec np.newaxis et opération de diffusion

Il s'agit d'un article dans lequel j'ai écrit ma propre compréhension à partir de la question de savoir ce qu'est une image np.array 3D et ce qu'est np.newaxis. La première moitié de l'article qui décrit l'image de np.array et les bases de np.newaxis est ici. Dans cet article, je vais vous expliquer comment utiliser np.newaxis. Plus précisément, lorsqu'il y a deux tableaux bidimensionnels dans lesquels plusieurs vecteurs bidimensionnels sont agencés, ce qui a été mentionné pour la première fois dans la première moitié de l'article, le carré de la distance entre les vecteurs inclus dans les deux est calculé par arrondi. regarder.

ÉTAPE 3. Diffusion

Avant d'entrer dans le sujet principal, passons en revue l'émission. C'est un gars qui fait les calculs entre des tableaux de formes différentes.

>>> x = np.array([1, 2])  #Horizontal 2 vertical 1 vecteur
>>> A = np.array([[1, 2],
                  [3, 4],
                  [5, 6]])  #Matrice horizontale 2 verticale 3
>>> B = np.array([[1],
                  [2]])  #Matrice horizontale 1 verticale 2
>>> C = np.array([[[1],
                   [2]],

                  [[3],
                   [4]]])  #Réseau 3D avec 1 profondeur horizontale 2 verticale 2

>>> x + A  #Il devient une procession de 2 horizontales 3
array([[2, 4],
       [4, 6],
       [6, 8]]) 
>>> x + B  #Il devient une procession de 2 horizontales et 2 verticales
array([[2, 3],
       [3, 4]])
>>> x + C  #Il devient un tableau tridimensionnel avec 2 horizontales, 2 verticales et 2 profondeur.
array([[[2, 3],
        [3, 4]],

       [[4, 5],
        [5, 6]]])

qiita_broadcast.jpg

ÉTAPE 4. Augmentez la cote et effectuez le calcul de diffusion

Pour en revenir au sujet principal, qu'est-ce qui rend np.newaxis heureux? Voilà l'histoire.

Pour un tableau à une dimension

Si vous pensez à un tableau unidimensionnel comme point de départ, est-il possible d'utiliser np.newaxis pour "stocker les résultats des opérations de round robin de chaque élément de deux tableaux dans un nouvel axe"?

Par exemple, si vous avez $ x = [1, 3, 5, 7] $ et $ y = [2, 4, 6] $ et que vous voulez faire un calcul à tour de rôle de 4 $ \ times3 = 12 $, utilisez np.newaxis pour $ y. Si vous convertissez $ en une matrice de 3 verticales horizontales 1 puis calculez $ x $, vous pouvez obtenir une matrice de 3 verticales horizontales 4 en diffusant.

>>> x = np.array([1, 3, 5, 7])
>>> y = np.array([2, 4, 6])
>>> x[np.newaxis, :] + y[:, np.newaxis]  #Ajouter en arrondissant les éléments de x et y
array([[  3,  5,  7,  9],
       [  5,  7,  9, 11],
       [  7,  9, 11, 13]])
# x + y[:, np.newaxis]Mais pareil

qiita_newaxis1.jpg

Pour un tableau à deux dimensions

Mais qu'en est-il des deux dimensions? Supposons que vous ayez deux vecteurs horizontaux disposés verticalement de la même dimension (ici, deux dimensions) comme indiqué ci-dessous.

>>> A = np.array([[1, 2],
                  [3, 4],
                  [5, 6]])
>>> B = np.array([[1, 1],
                  [2, 2]])

À ce stade, si vous introduisez correctement np.newaxis, vous pouvez effectuer une opération circulaire pour chaque composant du vecteur. Une image de l'exécution d'une opération circulaire d'un tableau à une dimension plusieurs fois en même temps (composant $ x $ et composant $ y $ ci-dessus).

>>> A[np.newaxis, :, :] - B[:, np.newaxis, :]  #Soustraction circulaire des composantes x et y
array([[[ 0, 1],
        [ 2, 3],
        [ 4, 5]],

      [[[-1, 0],
        [ 1, 2],
        [ 3, 4]]])
# A - B[:, np.newaxis, :]Mais pareil

qiita_newaxis2.jpg

Si vous l'organisez de manière à ce qu'il soit diffusé correctement, vous pouvez obtenir la même valeur même si vous modifiez la façon de prendre un nouvel axe.

>>> A.T[np.newaxis, :, :] - B[:, :, np.newaxis]  #Soustraction circulaire des composantes x et y
array([[[ 0, 2, 4],
        [ 1, 3, 5]],

      [[[-1, 1, 3],
        [ 0, 2, 4]]])
# A.T - B[:, :, np.newaxis]Mais pareil

qiita_newaxis2_2.jpg

Sujet principal

Étant donné la paire ci-dessus de vecteurs bidimensionnels $ A $ et $ B $, arrondissons (distance inter-vectorielle) $ ^ 2 $. Le carré de la distance entre $ (a_x, a_y) $ et $ (b_x, b_y) $ est $ (a_x-b_x) ^ 2 + (a_y-b_y) ^ 2 $, donc d'abord les composants $ x $, les composants $ y $ Tout ce que vous avez à faire est d'arrondir les carrés des soustractions entre eux, et c'est exactement le carré du calcul que vous avez fait ci-dessus. Après cela, ajoutez le carré de la différence du composant $ x $ et le carré de la différence du composant $ y $ = additionnez le troisième axe qui n'est pas ajouté à $ A $ ou $ B $ en tant que nouvel axe. (C'est plus facile à comprendre si vous l'imaginez avec une image).

>>> ((A.T[np.newaxis, :, :] - B[:, :, np.newaxis])**2).sum(axis=1)
array([[ 1, 13, 41],
       [ 1,  5, 25]])
# ((A.T - B[:, :, np.newaxis])**2).sum(axis=1)Peut être

q_newax2_sum.jpg

Cela équivaut à la formule extraite de "Essence of Machine Learning" au tout début de Dernière fois. De plus, comme nous l'avons vu ci-dessus, l'emplacement du nouvel axe que vous ajoutez à $ A $ ou $ B $ n'est pas unique et vous pouvez obtenir le même résultat en procédant comme suit:

>>> ((A[np.newaxis, :, :] - B[:, np.newaxis, :])**2).sum(axis=2)
array([[ 1, 13, 41],
       [ 1,  5, 25]])
# ((A - B[:, np.newaxis, :])**2).sum(axis=2)Mais d'accord

>>> ((A.T[:, np.newaxis, :] - B.T[:, :, np.newaxis])**2).sum(axis=0)
array([[ 1, 13, 41],
       [ 1,  5, 25]])

Pour trouver la distance entre les vecteurs, prenez la racine carrée de ceci.

Recommended Posts

Élevez la dimension avec np.newaxis et opération de diffusion
Vérifiez le fonctionnement d'OpenCV3 installé par Anaconda
Créez Fatjar en changeant la classe principale avec Gradle
Jouez avec l'API de consommation d'énergie fournie par Yahoo
Changer le mouvement en changeant la liste déroulante avec tkinter
Obtenez l'état de fonctionnement de JR West avec Python
Obtenez le chemin complet référencé par .lnk avec wsl