Intervall auf [-pi,pi] abbilden

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Leonie92
User
Beiträge: 3
Registriert: Sonntag 10. März 2019, 13:05

Hallo zs,

gibt es eine einfache Methode um Werte in einem beliebigen Intervall, z.B.

Code: Alles auswählen

x = np.array([-6,-5,-4,-3,-2,-1,0,1,2,3,5,6])
auf das Intervall in [-pi,pi] abzubilden.

Um x auf [0,2pi] abzubilden, muss man einfach nur

Code: Alles auswählen

x % (2*np.pi)
verwenden. Ich frage mich, ob es eine ähnlich einfache Methode für die Abbildung in [-pi,pi] gibt.
Benutzeravatar
ThomasL
User
Beiträge: 1379
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Deinem Modulo Code kann ich nicht folgen.

Code: Alles auswählen

import numpy as np

x = np.array([-6,-5,-4,-3,-2,-1,0,1,2,3,5,6])

def remap(x, in_min, in_max, out_min, out_max):
    return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min

remap(x, min(x), max(x), -np.pi, np.pi)

"""
array([-3.14159265, -2.61799388, -2.0943951 , -1.57079633, -1.04719755,
       -0.52359878,  0.        ,  0.52359878,  1.04719755,  1.57079633,
        2.61799388,  3.14159265])
"""
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Benutzeravatar
ThomasL
User
Beiträge: 1379
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Man kann die Ermittlung des min und max Wertes der Eingabewerte natürlich in die Funktion packen

Code: Alles auswählen

def remap(x, out_min, out_max):
    in_min = min(x)
    return (x - min(x)) * (out_max - out_min) / (max(x) - min(x)) + out_min

print(remap(x, -np.pi, np.pi))

# [-3.14159265 -2.61799388 -2.0943951  -1.57079633 -1.04719755 -0.52359878
#   0.          0.52359878  1.04719755  1.57079633  2.61799388  3.14159265]
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Leonie92
User
Beiträge: 3
Registriert: Sonntag 10. März 2019, 13:05

Danke für die schnelle Antwort. In deinem Code ist ein Fehler.

Die gesuchte Abbildung sollte die Werte -3,-2,-1,1,2,3 unverändert lassen, da diese bereits im Intervall [-pi,pi] liegen.

In deiner Lösung tauchen die Werte nicht mehr auf.

-------------------------------------------------------------------------------------------------

Code: Alles auswählen

x = array([-6,-5,-4,-3,-2,-1,0,1,2,3,5,6])
x % (2*pi) 

--> array([0.28318531, 1.28318531, 2.28318531, 3.28318531, 4.28318531,
       5.28318531, 0.        , 1.        , 2.        , 3.        ,
       5.        , 6.        ]) 
Wie oben beschrieben, wird das Intervall x durch die Modulo-Operation auf [0,2pi] abgebildet.
Benutzeravatar
ThomasL
User
Beiträge: 1379
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Mein Beispielcode nimmt eine "Abbildung" der Werte eines Intervalls auf ein anderes Intervall vor.
Das was du willst ist keine "Abbildung".
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Benutzeravatar
__blackjack__
User
Beiträge: 14051
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@ThomasL: Kommt auf die Definition von Abbildung an. In der Mathematik ist eigentlich alles eine Abbildung was Werte aus einer Menge in einen anderen Menge abbildet, also auch das was Leonie92 da machen will. Abbildungen müssen nicht bijektiv sein — das heisst es ist nicht zwingend vorausgesetzt das man aus dem Ergebnis auch wieder eindeutig auf die Ausgangsmenge zurück abbilden kann.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
ThomasL
User
Beiträge: 1379
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

@__blackjack__ Stimmt. Was auch immer sie will, es ist keine "lineare" Abbildung eines Intervalls auf ein anderes. Und diese Angabe fehlte.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Antworten