Springen naar inhoud

Mathematica: lijstjes maken


  • Log in om te kunnen reageren

#31

Phys

    Phys


  • >5k berichten
  • 7556 berichten
  • VIP

Geplaatst op 05 mei 2009 - 14:45

het zijn er natuurlijk 60, niet 120 zoals ik eerst schreef

5 waarden per maand, 12 maanden per jaar, 5 jaar, dat lijkt me 5*5*12=300 waarden, toch?

Nu wil ik een tabel maken met de drie maanden die het verst boven de x-as liggen (warmste) en een tabel met de drie maanden die het verst onder de x-as liggen (koudste). Wat ik in principe dus wil doen is denk ik de drie elementen met het kleinste gemiddelde vinden en de drie elementen met het grootste gemiddelde. Weet jij hoe dat kan?

T heeft in bovenstaand voorbeeld dus 12 elementen. Laten we eerst de gemiddelden berekenen:
gem = Table[Mean[T[[i]]], {i, 1, Length[T]}]
Output={-1, -2, 14/5, 47/5, 69/5, 98/5, 21, 109/5, 79/5, 58/5, 16/5, -4/5}
Laten we de lijst sorteren van laag naar hoog:
gems = Sort[gem]

Output={-2, -1, -4/5, 14/5, 16/5, 47/5, 58/5, 69/5, 79/5, 98/5, 21, 109/5}

Pak de drie koudste maanden:
koud= Take[gems, 3]
Output={-2, -1, -4/5}
Pak de drie warmste maanden:
warm = Take[gems,-3]
Output={98/5, 21, 109/5}

Alles in en code:

gem = Sort[Table[Mean[T[[i]]], {i, 1, Length[T]}]]
warm = Take[gems, 3]
koud = Take[gems, -3]

Never express yourself more clearly than you think.
- Niels Bohr -

Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#32

Lapzwans

    Lapzwans


  • >100 berichten
  • 145 berichten
  • Ervaren gebruiker

Geplaatst op 05 mei 2009 - 15:19

5 waarden per maand, 12 maanden per jaar, 5 jaar, dat lijkt me 5*5*12=300 waarden, toch?


Elk element van T bevat de de gemiddelde maandtemperaturen van 2000-2004. Dus T[[1]] = {-1, -2, -2, -1, 1} en dus in januari 2000 was het gemiddeld -1 graden celsius, in 2001 was het in januari -2, enz.

Echter, ik ben bang dat ik een foutje heb gemaakt met mijn vraag, het is namelijk iets ingewikkelder. Mag ik je een PM sturen met mijn notebook?

#33

Phys

    Phys


  • >5k berichten
  • 7556 berichten
  • VIP

Geplaatst op 05 mei 2009 - 15:37

Ja hoor.
Never express yourself more clearly than you think.
- Niels Bohr -

#34

Lapzwans

    Lapzwans


  • >100 berichten
  • 145 berichten
  • Ervaren gebruiker

Geplaatst op 06 mei 2009 - 14:56

Zelfde vraag als hierboven eigenlijk, maar nu wil eigenlijk in n keer de drie grootste en drie laagste waarden vinden, zonder eerst het gemiddelde van de elementen van T te berekenen.

T = {{-1, -2, -2, -1, 1}, {-2, 2, -3, -4, -3}, {2, 2, 3, 4, 3}, {8, 7, 9, 11, 12}, {15, 12, 13, 14, 15}, {18, 17, 20, 22, 21}, {21, 22, 20, 21, 21}, {20, 21, 23, 24, 21}, {16, 15, 15, 16, 17}, {11, 12, 12, 11, 12}, {7, 5, 3, 4, -3}, {-1, 3, -2, -3, -1}}

Dus groot = {24, 23, 22} en klein = {-4, -3, -3} (als ik het goed heb). Ik kan T nu niet makkelijk sorteren van hoog naar laag, want alle getallen zijn weer opgedeeld in twaalf elementen. Enig idee Phys?

#35

Phys

    Phys


  • >5k berichten
  • 7556 berichten
  • VIP

Geplaatst op 06 mei 2009 - 15:50

Gebruik Flatten:

min = Take[Sort[Flatten[T]], 3]
max = Take[Sort[Flatten[T]], -3]
Never express yourself more clearly than you think.
- Niels Bohr -

#36

Lapzwans

    Lapzwans


  • >100 berichten
  • 145 berichten
  • Ervaren gebruiker

Geplaatst op 06 mei 2009 - 18:09

Nice. Ik moet eigenlijk ook de maanden en jaartallen weten van die die warmste en koudste meetwaarden. Ik moet dan dus weten in welk van de 12 elementen van T de meetwaarde voorkomt (welke maand dus) en dan op welke positie in dat element (het jaartal). Ik mag ook gewoon het maandnummer geven. Dat is misschien makkelijker, want als ik de lijst transponeer dan staat het geheel weer op chronologische volgorde en dan is de positie van het element gelijk aan het maandnummer.

Dus dan zou ik zoiets kunnen doen:

Ordering[Transpose[T],3]

Dat zou werken als T niet onderverdeeld was in elementen. Is er dus een manier om simpelweg alle haakjes in T weg te halen en n lange lijst te krijgen? Dus eerst transponeren en dan alle haakjes weghalen en dan met Ordering kan ik makkelijk de posities van de drie grootste en kleinste waarden vinden.

#37

Phys

    Phys


  • >5k berichten
  • 7556 berichten
  • VIP

Geplaatst op 06 mei 2009 - 19:03

't probleem is dat bijv. de temperatuur -3 in meerdere maanden en jaren voorkomt. Wil je dan alle jaren (jaar 3,4,5) en maanden (maand 2,11,12) weten wanneer deze temperatuur voorkwam?
Never express yourself more clearly than you think.
- Niels Bohr -

#38

Lapzwans

    Lapzwans


  • >100 berichten
  • 145 berichten
  • Ervaren gebruiker

Geplaatst op 06 mei 2009 - 21:52

Inderdaad, maar dit was alleen een voorbeeldje. Mijn echte lijst heeft volgens mij allemaal unieke getallen. Ik heb de lijst even veranderd zodat de grootste en kleinste drie uniek zijn.

T = {{-1, -2, -2, -1, 1}, {-6, 2, -7, -8, -3}, {2, 2, 3, 4, 3}, {8, 7, 9, 11, 12}, {15, 12, 13, 14, 15}, {18, 17, 20, 22, 21}, {21, 22, 20, 21, 21}, {20, 26, 28, 28, 21}, {16, 15, 15, 16, 17}, {11, 12, 12, 11, 12}, {7, 5, 3, 4, -3}, {-1, 3, -2, -3, -1}}

Lukt het dan?

#39

Phys

    Phys


  • >5k berichten
  • 7556 berichten
  • VIP

Geplaatst op 06 mei 2009 - 22:34

Ter controle: in deze nieuwe lijst zijn de drie koudste temperaturen
min = Take[Sort[Flatten[T]], 3]
Output={-8, -7, -6}

Dit kunnen we ook zo vinden:
Take[Sort[Table[Min[Transpose[T][[i]]], {i, 1, Length[S]}]], 3]
In welk jaar dit gebeurde, zien we met:
Ordering[Table[Min[Transpose[T][[i]]], {i, 1, Length[S]}], 3]
Output={4, 3, 1}
Dus in jaar 4, 3 en 1, in volgorde van koud-warm.

Voor het maandnummer werkt dit niet, omdat je per maand de kleinste neemt, dus als in en maand de twee laagste temperature voorkomen gooi je er eentje weg. Per jaar gaat dit toevallig wel goed omdat die kans bij een lijst van 5 elementen veel kleiner is ;)
Oftewel: ik heb nog geen goede oplossing. Het is zeker te doen, dat wel. Je zou misschien een module kunnen schrijven. Ik denk nog even na.
Never express yourself more clearly than you think.
- Niels Bohr -

#40

Phys

    Phys


  • >5k berichten
  • 7556 berichten
  • VIP

Geplaatst op 06 mei 2009 - 23:20

Ok, ik heb een sneaky manier gevonden. Ik heb namelijk gewoon de maandnummers expliciet aan ieder getal toegevoegd, zodat iedere temperatuur T eruit ziet als {x,T} waarbij x het maandnummer is. Met de functie SortBy kun je een lijst sorteren door alleen naar het tweede element te kijken (dus door alleen naar T te kijken en het maandnummer te negeren). In en code wordt het uiteindelijk:

T = {{-1, -2, -2, -1, 1}, {-6, 2, -7, -8, -3}, {2, 2, 3, 4, 3}, {8, 7, 9, 11, 12}, {15, 12, 13, 14, 15}, {18, 17, 20, 22, 21}, {21, 22,  20, 21, 21}, {20, 26, 28, 28, 21}, {16, 15, 15, 16, 17}, {11, 12, 12, 11, 12}, {7, 5, 3, 4, -3}, {-1, 3, -2, -3, -1}};
maand = Range[1, 12];
jaar = Range[1, 5];

Take[SortBy[Flatten[Table[Take[SortBy[Table[{maand[[i]], Transpose[T][[j]][[i]]}, {i, 1,Length[maand]}], Last],3], {j, 1, Length[jaar]}], 1], Last], 3]
Output={{2, -8}, {2, -7}, {2, -6}}

Dit betekent dus: temperatuur -8 is in maand 2 bereikt, -7 in maand 2, en -6 in maand 2. Als het goed is werkt dit algemeen.
Never express yourself more clearly than you think.
- Niels Bohr -

#41

Lapzwans

    Lapzwans


  • >100 berichten
  • 145 berichten
  • Ervaren gebruiker

Geplaatst op 07 mei 2009 - 00:20

Daar was ik dus nooit opgekomen, maar het werkt wel, ook voor mijn veel grotere lijst. Ik zie echter nog niet precies in hoe ik het jaartal eruit kan halen. Als ik alleen het maandnummer 1-12 opgeef is namelijk niet te zien in welk jaar dat is. Ik mag namelijk f het maandnummer opgeven f het jaar en de maand. Moet ik daaruit concluderen dat het maandnummer gewoon doortelt na n jaar? Dus januari 2001 is dan maandnummer 13?

Nog een vraagje trouwens, als ik heb:

L1 = {1, 2, 3}

Weet jij hoe ik die kan omdraaien om L2 = {3, 2, 1} te krijgen? Zonder Sort[L1, Greater] te gebruiken.

Veranderd door Lapzwans, 07 mei 2009 - 00:22


#42

Phys

    Phys


  • >5k berichten
  • 7556 berichten
  • VIP

Geplaatst op 07 mei 2009 - 00:31

Even een kort antwoord op je tweede vraag:
Reverse[{1,2,3}]
soms kan het leven simpel zijn ;)

PS: de methode werkt natuurlijk ook voor de drie grootste temperaturen, door 3 te veranderen in -3
Never express yourself more clearly than you think.
- Niels Bohr -

#43

Phys

    Phys


  • >5k berichten
  • 7556 berichten
  • VIP

Geplaatst op 07 mei 2009 - 01:15

Wat dacht je hiervan ;)

T = {{-1, -2, -2, -1, 1}, {-6, 2, -7, -8, -3}, {2, 2, 3, 4, 3}, {8, 7, 9, 11, 12}, {15, 12, 13, 14, 15}, {18, 17, 20, 22, 21}, {21, 22,  20, 21, 21}, {20, 26, 28, 28, 21}, {16, 15, 15, 16, 17}, {11, 12, 12, 11, 12}, {7, 5, 3, 4, -3}, {-1, 3, -2, -3, -1}};
maand = Range[1, 12];
jaar = Range[1, 5];
Take[SortBy[ Flatten[Table[Map[Prepend[#, jaar[[i]]] &, Table[Take[SortBy[Table[{maand[[i]], Transpose[T][[j]][[i]]}, {i, 1, Length[maand]}], Last], 3], {j, 1,Length[jaar]}][[i]]], {i, 1, Length[jaar]}], 1], Last], 3]
Output={{4, 2, -8}, {3, 2, -7}, {1, 2, -6}}
Oftewel {jaar, maand, temperatuur} voor de drie laagste temperaturen.

Evenzo
Take[SortBy[ Flatten[Table[Map[Prepend[#, jaar[[i]]] &, Table[Take[SortBy[Table[{maand[[i]], Transpose[T][[j]][[i]]}, {i, 1, Length[maand]}], Last], -3], {j, 1,Length[jaar]}][[i]]], {i, 1, Length[jaar]}], 1], Last], -3]
Output={{2, 8, 26}, {3, 8, 28}, {4, 8, 28}}
voor de drie hoogste temperaturen.
Never express yourself more clearly than you think.
- Niels Bohr -

#44

Lapzwans

    Lapzwans


  • >100 berichten
  • 145 berichten
  • Ervaren gebruiker

Geplaatst op 07 mei 2009 - 02:02

Phys, je bent briljant ;) Het werkt perfect!

Veranderd door Lapzwans, 07 mei 2009 - 02:04


#45

Lapzwans

    Lapzwans


  • >100 berichten
  • 145 berichten
  • Ervaren gebruiker

Geplaatst op 07 mei 2009 - 02:45

Eerlijk, ik ben bijna klaar nu, maar toch nog een vraagje ;)

L1 = {1, 2, 3, 4, 5, 6, 7};
L2 = {{4, 2}, {5, 3}, {6, 4}, {7, 5}, {8, 6}, {9, 7}, {10, 8}, {11, 
	9}};
TableForm[Table[{L1[[i]], L2[[i]]}, {i, 1, 7}], 
 TableHeadings -> {None, {"Tabel", "Bla"}}]

Deze code geeft een eenvoudig tabelletje. L2 bestaat uit twee cijfers en die staan in de tabel onder elkaar. Nu wil ik voor het eerste cijfer telkens a = en voor het cijfer eronder b = krijgen. Dus a = 4, b = 2 in de eerste rij en a = 5, b = 3 in de tweede rij, etc. Weet jij een commando waarmee ik dit kan bewerkstelligen?





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures