• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Sposób na "odwrócenie" liczb.

VPS Starter Arubacloud
0 głosów
453 wizyt
pytanie zadane 14 marca 2020 w Matematyka, fizyka, logika przez Bartx Bywalec (2,120 p.)
edycja 14 marca 2020 przez Bartx
Potrzebuję sposobu na odwrócenie liczb (nie wiem jak to nazwać):

Mam dwie liczby graniczne, maksymalną: 270 i minimalną: 50 oraz ciąg liczb: 10, 11, 15, 17, 20, 21, 22, 23, 24, 26.

Liczba 10 powinna zamienić się w liczbę 270, a liczba 26 w liczbę 50, reszta liczb w ciagu tak samo. Potrzebuję wzoru który by to odwrócił. Chcę to wykorzystać w JavaScripcie.
komentarz 14 marca 2020 przez tkz Nałogowiec (42,000 p.)
Normalizacja?
komentarz 14 marca 2020 przez Bartx Bywalec (2,120 p.)

Nie mam pojęcia surprise

2 odpowiedzi

+2 głosów
odpowiedź 14 marca 2020 przez Benek Szeryf (90,690 p.)
wybrane 14 marca 2020 przez Bartx
 
Najlepsza

Co prawda w Pythonie, ale algorytm jest uniwersalny:

seq = [10, 11, 15, 17, 20, 21, 22, 23, 24, 26]
beg = 270
end = 50

def convert(seq, beg, end):
    step = (beg - end)/(seq[-1] - seq[0])
    return [beg - step*i for i in [i-seq[0] for i in seq]]

Wynikiem jest:

[270.0, 256.25, 201.25, 173.75, 132.5, 118.75, 105.0, 91.25, 77.5, 50.0]

 

komentarz 14 marca 2020 przez Bartx Bywalec (2,120 p.)
Dzięki, a mógłbyś to trochę wytłumaczyć, bo python jest dla mnie niezrozumiały?
komentarz 14 marca 2020 przez Benek Szeryf (90,690 p.)

1. Funkcja convert przyjmuje 3 argumenty: ciąg liczb, wartość początkową przekonwertowanego ciągu, wartość końcową przekonwertowanego ciągu.

2. Najpierw obliczany jest krok dla przekonwertowanego ciągu. Stanowi on iloraz zakresu przekonwertowanego ciągu (270 - 50 = 220) podzielonego przez krok ciągu wejściowego (26 - 10 = 16). Czyli 220/16 = 13.75. Innymi słowy nowy ciąg zmienia się z krokiem co 1, a nowy co 13.75. Czyli zmiana o 1 w ciągu wejściowym odpowiada zmianie o 13.75 w ciągu przekonwertowanym.

3. Jeśli początkowa wartość byłaby 50, a końcowa 270, to krok byłby równy -13.75.

4. W returnie iterujesz po liście, która zawiera różnice między każdym elementem a pierwszym elementem wejściowego ciągu. To jest ten fragment:

[i-seq[0] for i in seq]

Robimy tak, bo znamy początkową wartość przekonwertowanego ciągu (jest nią 270). Znamy również krok 13.75. Ponieważ interesują nas zmiany sąsiednich elementów ciągu wejściowego, dlatego musimy używać ciągu różnicowego, a nie pierwotnego. Innymi słowy powyższy fragment kodu tworzy tymczasowy ciąg wejściowy, zawierający różnice.

5. Znając różnice (indeks i) przemnażamy je przez krok ciągu przekonwertowanego 13.75 i odejmujemy od wartości początkowej (270).

komentarz 14 marca 2020 przez Bartx Bywalec (2,120 p.)
Ok, rozumiem, a co jeśli ciąg nie zaczynałby się od najniższej liczby i nie kończył się najwyższą, czyli np. [11, 10, 20, 17, 15, 21, 22, 23, 26, 24]? Wydaje mi się, że pozostaje tylko znalezienie wartości index dla najwyższej i najniższej wartości, czy może jest prostszy sposób?
komentarz 14 marca 2020 przez Benek Szeryf (90,690 p.)

W zasadzie należałoby dokonać drobnych zmian. Zamiast zakładać, że wartość minimalna jest pod pierwszym elementem wejściowego ciągu i wartość maksymalna jest pod ostatnim elementem ciągu, można je policzyć samodzielnie:

def convert(seq, beg, end): 
    step = (beg - end)/(max(seq) - min(seq)) 
    return [beg - step*i for i in [i-min(seq) for i in seq]]

Wynikiem jest:

[256.25, 270.0, 132.5, 173.75, 201.25, 118.75, 105.0, 91.25, 50.0, 77.5]

A zachowane proporcje zawdzięczamy temu, że w return iterowaliśmy po różnicach i skalowaliśmy nimi poszczególne wartości w każdej iteracji.

Innymi słowy, tak, masz rację.

0 głosów
odpowiedź 14 marca 2020 przez Paweł Nąckiewicz Nałogowiec (48,990 p.)
Ten ciąg znaków to jakaś tablica? Jeśli tak to wstaw na pierwszy element tablicy liczbę 270 i na ostatni 50.
komentarz 14 marca 2020 przez Bartx Bywalec (2,120 p.)
Tak to jest tablica. Jeśli zmienię pierwszą i ostatnią wartość to te środkowe zostaną takie jakie były, a to mi nic nie da.
komentarz 14 marca 2020 przez Paweł Nąckiewicz Nałogowiec (48,990 p.)
a jakie wartości maja mieć te środkowe?
komentarz 14 marca 2020 przez Bartx Bywalec (2,120 p.)
Proporcjonalne do zmian z początku i z tyłu ciągu. Przykładowo, myślę, że 18 w ciągu powinno przybrać wartość 110.
komentarz 14 marca 2020 przez Paweł Nąckiewicz Nałogowiec (48,990 p.)
nie rozumiem... Mógłbyś proszę dokładnie opisać jak to ma się zmieniać index po indexie?
komentarz 14 marca 2020 przez tkz Nałogowiec (42,000 p.)

Normalizacja danych, pisałem w komentarzu. Samo pytanie jest bardzo niejasne, ale po tym, że mają być proporcjonalne, wychodzi na to, że jest to, powiązane z statystyką.

https://stackoverflow.com/questions/38705953/normalizing-data-using-javascript

Podobne pytania

0 głosów
1 odpowiedź 199 wizyt
0 głosów
1 odpowiedź 171 wizyt
pytanie zadane 2 grudnia 2018 w Matematyka, fizyka, logika przez Absum Bywalec (2,640 p.)

92,452 zapytań

141,262 odpowiedzi

319,079 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...