2016-05-04 3 views
2

Ich bin relativ neu in Programmierung und Mathematik, also vergib mir, wenn ich diese Frage nicht in der richtigen Weise stelle. Im Grunde habe ich eine Reihe von Daten, wie folgt aus:Wie kann ich in Python Werte auf andere Skalierungen abbilden?

dateList = ['1818', '1813', '1818', '1811', '1813'] 

und ich möchte diese schließlich zeichnen, aber die Handlung Funktion braucht Werte zwischen, sagen wir, 30 und 80, um gut auszusehen. Das heißt, die min dieser Satz 1811 bei 30 sein sollte, und die max 1818 sollte bei 80. Gibt es eine Möglichkeit, eine Funktion fancyMap so zu schreiben, dass:

fancyMap(dateList, (30, 80)) 

gibt so etwas wie (Erraten hier):

[80, 52, 80, 30, 52] 

ich weiß, dass es einige einfache mathematische hier beteiligt ist, aber ich bin nicht sicher, was es ist.

+0

I der niedrigste Wert in Ihrer Eingabe denken an die min abbildet gebunden Du gehst zur Kartenfunktion, oder? In Ihrem Beispiel sollte 1811 im Ausgabesatz in 20 umgewandelt werden. Vielleicht verstehe ich genau, was Sie hier fragen. –

+0

Ja. Diese 20 sollte 30 sein. Danke, dass du das bemerkt hast. Korrigiert. – Jono

+1

Das Konzept heißt "lineare Interpolation", aber ich möchte überprüfen; Sind Ihre Low-High-Argumente (30, 80) immer positiv? – roganjosh

Antwort

4

Als Ergänzung zu Claris' Antwort, funktioniert diese Funktion für verschiedene Grenzen:

def fancyMap(array, low, high): 
    array = [int(numeric_string) for numeric_string in array] 
    minimum = min(array) 
    maximum = max(array) 

    diff = maximum - minimum 
    diffScale = high - low 

    return map (lambda x: int((int(x)-minimum)*(float(diffScale)/diff)+low), array) 
+0

Ihre Verwendung von 'int' funktioniert nicht, es wird auf 79 skaliert, nicht 80 – roganjosh

+1

Jetzt sollte dies gut funktionieren. Es wurde eine Integer Division mit 'diffScale/diff' gemacht. – Keiwan

+0

Sie könnten auch' from__future__ import division' machen, um die Integer Division zu vermeiden. – jpmc26

1

So ähnlich?

dateList = ['1818', '1813', '1818', '1811', '1813'] 
print map (lambda x: (int(x)-1811)*(50.0/7)+30, dateList) 

oder

print map (lambda x: int((int(x)-1811)*(50.0/7)+30), dateList) 
+0

Ich würde vorschlagen, dass Sie die Min und Max dynamisch herausziehen und den Skalierungsfaktor und Offset berechnen anstatt sie hart zu kodieren. – jpmc26

Verwandte Themen