[PYTHON] Écriture concise des opérations pour chaque paire dans les données à l'aide de la diffusion

En 3 lignes

Problème de réglage

Soit $ A $ l'ensemble de tous les $ (x, y) $ qui satisfont $ -1 \ leq x \ leq 1 $, $ -1 \ leq y \ leq 1 $. Lorsqu'un élément arbitraire est sélectionné dans $ A $, la distance L1 entre les points de grille contenus dans $ A $ et l'élément sélectionné est calculée.

La distance L1 entre $ (x_1, y_1) $ et $ (x_2, y_2) $ est exprimée comme suit.

d_1((x_1, y_1),(x_2,y_2)) = |x_1 - x_2|+|y_1 - y_2|

Façon de penser

Calculez la distance L1 entre l'élément sélectionné et tous les points de la grille, puis sélectionnez 5 par ordre croissant de distance.

Afin de calculer la distance L1 en une seule fois, considérez le np.ndarray suivant (ou tf.tensor).

lattice=np.array([[ 1,  1],
                  [ 1,  0],
                  [ 1, -1],
                  [ 0,  1],
                  [ 0,  0],
                  [ 0, -1],
                  [-1,  1],
                  [-1,  0],
                  [-1, -1]]) #shape = (9, 2)

Maintenant, supposons que l'original que vous avez choisi était $ (0,1,0,5) $. En fait, la notation suivante est efficace pour calculer la distance L1

data = np.array([0.1,0.5])
l1_dist = np.sum(np.abs(data-lattice),axis=1)

À première vue, cela ressemble à une formule normale, mais la partie data-lattice est soustraite l'une de l'autre avec des formes différentes. Ici, les deux formes sont automatiquement ajustées par diffusion.

(Référence: https://numpy.org/doc/stable/user/basics.broadcasting.html)

Selon la formule, les dimensions sont comparées à partir de l'arrière de la forme, et si une dimension est 1, la dimension est augmentée en copiant selon l'autre. Dans ce cas, la forme des "données" est "(2,)" et la "forme" du "treillis" est "(9,2)", donc la dimension du côté des "données" est ajustée.

array([[0.1, 0.5],
       [0.1, 0.5],
       [0.1, 0.5],
       [0.1, 0.5],
       [0.1, 0.5],
       [0.1, 0.5],
       [0.1, 0.5],
       [0.1, 0.5],
       [0.1, 0.5]])

A été considéré et la soustraction a été effectuée. Puis utilisez np.abs pour calculer la valeur absolue par élément et additionnez le long de l '" axe "approprié. l1_dist a la forme suivante: np.ndarray de (9,)

array([1.4, 1.4, 2.4, 0.6, 0.6, 1.6, 1.6, 1.6, 2.6])

Application au traitement par lots

La même idée peut être obtenue en augmentant le nombre d'éléments pour lesquels la distance L1 est calculée à deux ou plus. Supposons qu'il existe deux éléments cibles, chacun étant $ (0,1,0,5) et (0,7,0,8) $. Cette fois, les données seront probablement fournies dans le format suivant

data = np.array([[0.1, 0.5],
                 [0.7, 0.8]]) # shape = (2,2)

Dans ce cas, "data-lattice" ne génère pas de diffusion et une erreur se produit. En effet, les dimensions sont comparées depuis l'arrière de la forme, et ce n'est plus le cas lorsqu'une dimension est 1. La solution de contournement consiste à ajouter un axe de dimension 1 dans np.expand_dims.

data = np.expand_dims(data,axis=1) #forme de données= (2,1,2)de treillis(9,2)Comparer avec l'axe=9 données sur 1 sont dupliquées, axe=Deux treillis 0 sont dupliqués
l1_dist = np.sum(np.abs(data-lattice),axis=2) # (2,9,2)Après soustraction entre eux, axe=2 sommes sont effectuées. Notez que l'axe de la somme a changé en raison de l'expansion

Si tel est le cas, l1_dist est

array([[1.4, 1.4, 2.4, 0.6, 0.6, 1.6, 1.6, 1.6, 2.6],
       [0.5, 1.1, 2.1, 0.9, 1.5, 2.5, 1.9, 2.5, 3.5]]) # shape = (2, 9)

Sera.

Flou

Eh bien, le code est plus simple, mais je pense que le changement implicite de forme le rendrait gêné en termes de lisibilité. Je voudrais savoir s'il existe une meilleure pratique qui combine temps de traitement, lisibilité et simplicité.

référence

TensorFlow Machine Learning Cookbook Python-based Utilization Recipe 60+ (Je ne recommande pas d'acheter ce livre, cependant ...)

Recommended Posts

Écriture concise des opérations pour chaque paire dans les données à l'aide de la diffusion
Diffusion sur LINE en utilisant python
Essayez de vous connecter automatiquement à Netflix en utilisant python sur votre PC
Utilisez ScraperWiki pour obtenir régulièrement des données de votre site Web