[PYTHON] Tipps: Vergleich der Größe von drei Werten

Wie bekomme ich die Zahl zwischen zwei Zahlen?

Wenn Sie ein Programmierer sind, ist es unwahrscheinlich, dass Sie keinen Größenvergleich verwenden. Unter ihnen ist es üblich zu beurteilen, ob der Wert $ c $ zwischen $ a $ und $ b $ liegt.

Wie lösen Sie das obige Problem, wenn die Größenbeziehung zwischen $ a $ und $ b $ unbekannt ist?

Methode 1

Die sinnvollste Methode besteht darin, zuerst die Größenbeziehung zwischen $ a $ und $ b $ zu verstehen und sie dann mit $ c $ zu vergleichen.

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

Nun, es ist nicht sehr schön. Ich möchte dafür keine 4 Zeilen verwenden ...

Methode 2

Wenn wir uns das Obige ansehen, können wir sehen, dass $ c $ zwischen $ a $ und $ b $ liegt, wenn entweder $ b <c <a $ oder $ a <c <b $ gilt. Mit anderen Worten, wenn Sie es wie folgt aufrufen, passt es in eine Zeile.

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

Es wird besser. Dies hat jedoch auch $ a, b, c $ einmal und es fühlt sich ein bisschen überflüssig. Mit Python können Sie es so schön schreiben, aber mit C-Sprache müssen Sie es wie folgt schreiben.

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

Immerhin ist es nicht schön ...

Methode 3

Also habe ich mir eine Möglichkeit ausgedacht, wie folgt zu schreiben.

(a < c) ^ (b < c)

^ kann nicht viel verwendet werden, aber es ist eine exklusive logische Summe. Beide sind wahr, beide sind falsch, wenn sie falsch sind, und wahr, wenn die beiden wahr und falsch sind.

Dies hat jedoch seine Nachteile. Die obige Formel ist gleichbedeutend mit der folgenden.

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

Dies kann nicht wie "a <c <b" durch Ändern von "<" in ">" oder "<=" erfolgen.

Apropos,

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

Zwei von

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

Ist gleichbedeutend mit

Methode 4

Ich fragte mich, ob ich irgendwie "a <c <b" oder "a <= c <= b" machen könnte, aber ich dachte darüber nach, aber die folgende Methode könnte die eleganteste sein.

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

Die erste Zeile ist "a <c <b" und die zweite Zeile ist "a <= c <= b". Wenn der Wert groß ist, kann möglicherweise eine Codefunktion verwendet werden (obwohl die Berechnungszeit erheblich langsam zu sein scheint).

Berechnungszeit

Ich habe die Berechnungszeit jeder Methode gemessen. Das Programm verwendete Folgendes.

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)

Berechnungsergebnis

Methode Berechnungszeit
Methode 1 0.547s
Methode 2 0.458s
Methode 3 0.370s
Methode 4 0.786s

……。 (a - c) * (b - c) <0 ist das langsamste Ergebnis. Was ist langsamer als Methode 1 ... Ist es nicht einfach schön?

Ich habe es mehrmals versucht, aber das Ranking hat sich nicht geändert. Schließlich scheint die Multiplikation Zeit zu brauchen. Ein weiterer Grund ist, dass und und oder die Eigenschaft haben, nachfolgende Operationen zu ignorieren, wenn False oder True in der Mitte erscheint.

Ich bin enttäuscht, dass dies alles ist, deshalb habe ich auch die Berechnung des gesamten Numpy-Arrays überprüft.

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)

In numpy können Sie nicht wie "a <c <b" schreiben. Da es kein und oder gibt, müssen die logischen Operationen & und|verwendet werden. Die Berechnungszeit ist wie folgt.

Methode Berechnungszeit
Methode 2 0.037s
Methode 3 0.017s
Methode 4 0.031s

In diesem Fall war das Ergebnis, dass die Multiplikation schneller war. Ich habe es geschafft, mein Gesicht zu behalten ...

Zusammenfassung

Verwenden Sie die folgende Gleichung, um festzustellen, ob c zwischen a und b liegt.

** Zum Einzelvergleich **

## a < c < b or b < c <Im Fall von a
a < c < b or b < c < a
##Wenn a ≤ c ≤ b oder b ≤ c ≤ a ist
a <= c <= b or b <= c <= a
## a < c ≦ b or b <Wenn c ≤ a
(a < c) ^ (b < c)
## a ≦ c < b or b ≦ c <Im Fall von a
(a > c) ^ (b > c)

** Für numpy Arrays **

## a < c < b or b < c <Im Fall von a
(a - c) * (b - c) < 0
##Wenn a ≤ c ≤ b oder b ≤ c ≤ a ist
(a - c) * (b - c) <= 0
## a < c ≦ b or b <Wenn c ≤ a
(a < c) ^ (b < c)
## a ≦ c < b or b ≦ c <Im Fall von a
(a > c) ^ (b > c)

Recommended Posts

Tipps: Vergleich der Größe von drei Werten
Erhöhen Sie die Benutzeroberfläche von MyPaint
Über die Größe der Punkte in Matplotlib
Richten Sie die Größe der Farbleiste an der Matplotlib aus
Visualisieren Sie den Grenzwert des mehrschichtigen Perzeptrons
Ändern Sie die Schriftgröße der Legende in df.plot
Erhöhen Sie die Schriftgröße des Diagramms mit matplotlib
FAQ: Warum ist der Zahlenvergleich inkonsistent?
Gründlicher Vergleich von drei morphologischen Python-Analysebibliotheken
Berechnen Sie die Summe der eindeutigen Werte durch Pandas-Kreuztabellen
Ermitteln Sie die Größe (Anzahl der Elemente) von Union Find in Python
Der Beginn von cif2cell
Vergleich von LDA-Implementierungen
Vergleich von Online-Klassifikatoren
der Zen von Python
Reduzierung der Schneckengröße
Die Geschichte von sys.path.append ()
Vergleich der Anpassungsprogramme
Rache der Typen: Rache der Typen
Pepper entscheidet über den Gewinner, indem er die Größe des Applaus des Publikums misst
[Tipps] Probleme und Lösungen bei der Entwicklung von Python + Kivy
Finden Sie den Durchschnitt / die Standardabweichung der Helligkeitswerte im Bild