[PYTHON] Astuces: Comparaison de la taille de trois valeurs

Comment obtenir le nombre entre deux nombres?

Si vous êtes un créateur de programme, il est peu probable que vous n'utilisiez pas la comparaison de taille. Parmi eux, il est courant de juger "La valeur $ c $ est-elle comprise entre $ a $ et $ b $?".

Lorsque la relation de grandeur entre $ a $ et $ b $ est inconnue, comment résolvez-vous le problème ci-dessus?

Méthode 1

La méthode la plus sensée consiste d'abord à comprendre la relation de grandeur entre $ a $ et $ b $, puis à la comparer avec $ c $.

if a < b:
    a < c < b
else:
    b < c < a

Eh bien, ce n'est pas très beau. Je ne veux pas utiliser 4 lignes pour cela ...

Méthode 2

En regardant ce qui précède, nous pouvons voir que $ c $ est compris entre $ a $ et $ b $ si $ b <c <a $ ou $ a <c <b $ tient. En d'autres termes, si vous l'appelez comme suit, il tiendra sur une seule ligne.

(a < c < b) or (b < c < a)

Ça s'améliore. Cependant, cela a également $ a, b, c $ apparaissant une fois, et cela semble un peu redondant. Avec python, vous pouvez l'écrire si bien, mais avec le langage C, vous devez l'écrire comme suit.

((a < c) && (c < b)) || ((b < c) && (c < a))

Après tout, ce n'est pas beau ...

Méthode 3

Alors, j'ai trouvé un moyen d'écrire comme suit.

(a < c) ^ (b < c)

«^» peut ne pas être beaucoup utilisé, mais c'est une somme logique exclusive. Les deux sont True, les deux sont False lorsqu'ils sont False et True lorsque les deux sont True et False.

Cependant, cela a ses inconvénients. La formule ci-dessus est synonyme de la suivante.

(a < c <= b) or (b < c <= a)

Cela ne peut pas être fait comme ʻa <c <b en changeant <en> ʻou <=.

Au fait,

(a <= c) ^ (b <= c)
(a > c) ^ (b > c)

Deux de

(a <= c < b) or (b <= c < a)

Est synonyme de

Méthode 4

Je me suis demandé si je pouvais faire ʻa <c <b ou ʻa <= c <= b, mais j'y ai pensé, mais la méthode suivante est peut-être la plus élégante.

(a - c) * (b - c) < 0
(a - c) * (b - c) <= 0

La première ligne est ʻa <c <b et la deuxième ligne est ʻa <= c <= b. Si la valeur est grande, il peut être possible de prendre une fonction de code (bien que le temps de calcul semble être considérablement lent).

Temps de calcul

J'ai mesuré le temps de calcul de chaque méthode. Le programme a utilisé ce qui suit.

import time
import numpy as np

n = 100
number1 = np.random.rand(n)
number2 = np.random.rand(n)

t1 = time.time()
for j in range(10000):
    for i in range(n):
        if number1[i] < number2[i]:
            x = number1[i] < 0.5 < number2[i]
        else:
            x = number1[i] < 0.5 < number2[i]
t2 = time.time()
t = t2-t1
print(t)

t1 = time.time()
for j in range(10000):
    for i in range(n):
        x = (number1[i] < 0.5 < number2[i]) or (number1[i] < 0.5 < number2[i])
t2 = time.time()
t = t2-t1
print(t)

t1 = time.time()
for j in range(10000):
    for i in range(n):
        x = (number1[i] < 0.5) ^ (number2[i] < 0.5)
t2 = time.time()
t = t2-t1
print(t)

t1 = time.time()
for j in range(10000):
    for i in range(n):
        x = (number1[i] - 0.5) * (number2[i] - 0.5) < 0
t2 = time.time()
t = t2-t1
print(t)

Résultat du calcul

Méthode Temps de calcul
Méthode 1 0.547s
Méthode 2 0.458s
Méthode 3 0.370s
Méthode 4 0.786s

……。 (a --c) * (b --c) <0 est le résultat le plus lent. Qu'est-ce qui est plus lent que la méthode 1 ... N'est-ce pas juste magnifique?

Je l'ai essayé plusieurs fois, mais le classement n'a pas changé. Eh bien, après tout, il semble que la multiplication prend du temps. Une autre raison est que et et ou ont la caractéristique d'ignorer les opérations suivantes lorsque False ou True apparaît au milieu.

Je suis déçu que ce soit tout, j'ai donc également vérifié le calcul de l'ensemble du tableau numpy.

import time
import numpy as np

n = 100
number1 = np.random.rand(n)
number2 = np.random.rand(n)

t1 = time.time()
for j in range(10000):
    x = ((number1 < 0.5) & ( 0.5 < number2)) | ((number1 < 0.5) & (0.5 < number2))
t2 = time.time()
t = t2-t1
print(t)

t1 = time.time()
for j in range(10000):
    x = (number1 < 0.5) ^ (number2 < 0.5)
t2 = time.time()
t = t2-t1
print(t)

t1 = time.time()
for j in range(10000):
    x = ((number1 - 0.5) * (number2 < 0.5) < 0)
t2 = time.time()
t = t2-t1
print(t)

Dans numpy, vous ne pouvez pas écrire comme ʻa <c <b. De plus, comme il n'y a pas et, ou, il est nécessaire d'utiliser les opérations logiques &et|`. Le temps de calcul est le suivant.

Méthode Temps de calcul
Méthode 2 0.037s
Méthode 3 0.017s
Méthode 4 0.031s

Dans ce cas, le résultat était que la multiplication était plus rapide. J'ai réussi à garder mon visage ...

Résumé

Pour déterminer si c est compris entre a et b, utilisez l'équation suivante.

** Pour une comparaison un par un **

## a < c < b or b < c <Dans le cas d'un
a < c < b or b < c < a
##Quand a ≤ c ≤ b ou b ≤ c ≤ a
a <= c <= b or b <= c <= a
## a < c ≦ b or b <Lorsque c ≤ a
(a < c) ^ (b < c)
## a ≦ c < b or b ≦ c <Dans le cas d'un
(a > c) ^ (b > c)

** Pour le tableau numpy **

## a < c < b or b < c <Dans le cas d'un
(a - c) * (b - c) < 0
##Quand a ≤ c ≤ b ou b ≤ c ≤ a
(a - c) * (b - c) <= 0
## a < c ≦ b or b <Lorsque c ≤ a
(a < c) ^ (b < c)
## a ≦ c < b or b ≦ c <Dans le cas d'un
(a > c) ^ (b > c)

Recommended Posts

Astuces: Comparaison de la taille de trois valeurs
Augmenter la taille de l'interface utilisateur de MyPaint
À propos de la taille des points dans matplotlib
Alignez la taille de la barre de couleurs avec matplotlib
Visualisez la valeur limite du perceptron multicouche
Changer la taille de police de la légende dans df.plot
Augmentez la taille de la police du graphique avec matplotlib
FAQ: Pourquoi la comparaison des nombres est-elle incohérente?
Comparaison approfondie de trois bibliothèques d'analyse morphologique Python
Calculer la somme des valeurs uniques par tabulation croisée des pandas
Obtenir la taille (nombre d'éléments) de Union Find en Python
Le début de cif2cell
Comparaison des implémentations LDA
Comparaison des classificateurs en ligne
le zen de Python
Réduction de la taille des limaces
L'histoire de sys.path.append ()
Comparaison des programmes d'adaptation
La vengeance des types: la vengeance des types
Pepper décide du gagnant en mesurant l'ampleur des applaudissements du public
[Astuces] Problèmes et solutions dans le développement de python + kivy
Trouvez l'écart moyen / standard des valeurs de luminosité dans l'image