Mathematica - List - manipuliranje s podatki

O matematiki, številih, množicah in računih...
Odgovori
Uporabniški avatar
fogl
Prispevkov: 546
Pridružen: 7.11.2004 20:25
Kraj: Radovljica

Mathematica - List - manipuliranje s podatki

Odgovor Napisal/-a fogl »

Kako lahko iz podatkov:
x = List[{1, 2, 3}]
y = List[{4, 5, 6}]
sestavim skupne podatke, ki bodo predstavljali točke z x in y koordinato
t = List[{{1, 4}, {2, 5}, {3, 6}}]
(z uporabo x in y spremenljivke)?

Kako pa iz
t = List[{{1, 4}, {2, 5}, {3, 6}}]
izluščim spet nazaj List-o s samo x koordinato?

Marjan
Prispevkov: 320
Pridružen: 25.12.2002 17:01

Re: Mathematica - List - manipuliranje s podatki

Odgovor Napisal/-a Marjan »

Jaz naredim tako:

x = List[1, 2, 3];
y = List[4, 5, 6];

data = Thread[{x, y}]
=> {{1, 4}, {2, 5}, {3, 6}}

data[[All, 1]]
=> {1, 2, 3}

Uporabniški avatar
Aniviller
Prispevkov: 7263
Pridružen: 15.11.2004 18:16

Re: Mathematica - List - manipuliranje s podatki

Odgovor Napisal/-a Aniviller »

Transpose[{x,y}]
Da dobis nazaj "x" pa se enkrat transponiras in vzames prvi element.

Uporabniški avatar
fogl
Prispevkov: 546
Pridružen: 7.11.2004 20:25
Kraj: Radovljica

Re: Mathematica - List - manipuliranje s podatki

Odgovor Napisal/-a fogl »

Bom kar tukaj nadaljeval...

Imama tabelo oblike:
{{11, 12, 13}, {21, 22, 23}, {31, 32, 33}}
in bi jo rad pretvoril v obliko
{{{11, 12}, 13}, {{21, 22}, 23}, {{31, 32}, 33}}
In mi nikakor ne uspe (vsaj ne s funkcijo Partition) :roll:

Mogoče kdo ve kako se to naredi?

Uporabniški avatar
fogl
Prispevkov: 546
Pridružen: 7.11.2004 20:25
Kraj: Radovljica

Re: Mathematica - List - manipuliranje s podatki

Odgovor Napisal/-a fogl »

Pa še en problem imam, ki ga ne znam rešit:
Napisal sem funkcijo:

Koda: Izberi vse

cas[YMD_, HMS_] :=   DateList[{StringJoin[YMD, " ", HMS], {"Year", "Month", "Day","Hour", "Minute", "Second"}}]; 
SetAttributes[cas, Listable];
cas[{"2009-07-01", "01:30:00"}, {"2009-07-01", "01:30:00"}]
cas[{{"2009-07-01", "01:30:00"}, {"2009-07-01", "01:30:00"}}]
rezultat tega je:

Koda: Izberi vse

{{2009, 9, 22, 17, 7, 1}, {3, 5, 31, 1, 30, 0}}
{{cas["2009-07-01"], cas["01:30:00"]}, {cas["2009-07-01"], cas["01:30:00"]}}
Problem je, da so liste (List) vedno oblike {{},{},{}} in mi ne izračuna prav, v obliko {},{},{} je pa ne znam pretvorit, če se sploh da...
Mogoče kdo ve kako to rešit?

Uporabniški avatar
Aniviller
Prispevkov: 7263
Pridružen: 15.11.2004 18:16

Re: Mathematica - List - manipuliranje s podatki

Odgovor Napisal/-a Aniviller »

V mathematici ima vsaka stvar "glavo". Ce je navaden list je to List[], ce je funkcija nekih argumentov je f[...] in tako naprej.

Glavo lahko zamenjas. Tako da ce te muci tole:

Koda: Izberi vse

f[{x,y,z}] kar je enako f[List[x,y,z]]
naredi tole:

Koda: Izberi vse

f@@{x,y,z} kar je enako f[x,y,z]
(glavo "List" smo zamenjali z glavo "f" oziroma kakrsnakoli funkcija je ze v igri.
Mislim da deluje tudi f[Sequence[{x,y,z}]] (Sequence nekako "raztopi" zunanje oklepaje da izginejo ko das funkcijo okoli).

Uporabniški avatar
fogl
Prispevkov: 546
Pridružen: 7.11.2004 20:25
Kraj: Radovljica

Re: Mathematica - List - manipuliranje s podatki

Odgovor Napisal/-a fogl »

Sem poskusil vse variante, ampak deluje samo ena. Klik

Uporabniški avatar
Aniviller
Prispevkov: 7263
Pridružen: 15.11.2004 18:16

Re: Mathematica - List - manipuliranje s podatki

Odgovor Napisal/-a Aniviller »

Uh. Ok Sequence ne deluje zato ker si dal atribut Listable in gre pregloboko noter (Sequence + Listable imata skupni efekt da popolnoma razstavi 2D array). Nasploh casL ne bi smel biti Listable ker v definiciji zahtevas da je array, kar se pa nikoli ne zgodi ker Listable takoj potegne funkcijo znotraj arraya.

Ostalo je logicno.

Uporabniški avatar
fogl
Prispevkov: 546
Pridružen: 7.11.2004 20:25
Kraj: Radovljica

Re: Mathematica - List - manipuliranje s podatki

Odgovor Napisal/-a fogl »

Mani ni nič več logično, še tisti kar sem mislil da je ni več :roll:

Rad bi enostavno podatke shranjene v xx pretvoril v pripadajoče čase Klik

Enako kot če bi uporabil funkcijo Log[ {a, b, c}], le da so v mojem primeru a, b in c sestavljeni iz dveh spremenljivk. Simpl, ampak ne znam :(
Zdaj imam to rešeno s for zanko, ampak najbrž obstaja kaka bolj enostavna varianta.

Uporabniški avatar
Aniviller
Prispevkov: 7263
Pridružen: 15.11.2004 18:16

Re: Mathematica - List - manipuliranje s podatki

Odgovor Napisal/-a Aniviller »

Aja to bi rad. No tukaj imas najmanj 10 moznosti. Najbolj obicajna je "uporabi funkcijo na vseh elementih arraya", kar se uporablja skozi. To je funkcija "Map" ampak se vedno klice kar s kratko notacijo:

Koda: Izberi vse

casL/@xx
To samo nese funkcijo v oklepaj. Nekaj takega bi moral doseci z Listable ampak temu tezje dopoves da ti ne razdre tudi arrayev znotraj zunanjega lista (jaz se tem modifierjem funkcij izogibam ker povzrocijo da se funkcija obnasa drugace kot pricakovano).

Tisto kar sem ti pa prej razlagal (z @@) je pa razlikovanje med cas in casL:

Koda: Izberi vse

casL[enlist] ... cas@@enlist

S tem "Map" moras pazit, ce ni funkcija ene spremeljivke: v tem primeru lahko sestavis "cisto funkcijo" na mestu. Recimo ce hoces kvadrirat vse elemente arraya, naredis

Koda: Izberi vse

#^2& /@ array
(#^2 &) je sproti definirana funkcija: # je argument, & pa pove da naj tisto prej smatra kot funkcijo.

Uporabniški avatar
fogl
Prispevkov: 546
Pridružen: 7.11.2004 20:25
Kraj: Radovljica

Re: Mathematica - List - manipuliranje s podatki

Odgovor Napisal/-a fogl »

1000x hvala :D

Uporabniški avatar
fogl
Prispevkov: 546
Pridružen: 7.11.2004 20:25
Kraj: Radovljica

Re: Mathematica - List - manipuliranje s podatki

Odgovor Napisal/-a fogl »

Še nekaj me muči... rad bi začetne podatke na enostaven način združil v obliko v zadnji vrstici Klik. Poskusil sem z Append in MapThread, pa ne funkcionira. Kaka ideja?

Uporabniški avatar
Aniviller
Prispevkov: 7263
Pridružen: 15.11.2004 18:16

Re: Mathematica - List - manipuliranje s podatki

Odgovor Napisal/-a Aniviller »

Ok lahko bi malo kombiniral z Map in podobnimi zadevami ampak imamo lepse nacine.

Imas dve lepi sansi. Prva je, da prvo "matriko" transponiras (v eni vrstici te matrike sicer ne bodo stevilke ampak dvokomponentni vektorji ampak to mislim da ga ne moti ker gleda samo prvi dve dimenziji problemcka).
Dobis

Koda: Izberi vse

{
{{a,b},{c,d},{e,f}},
{x,y,z}
}
Zdaj so pac prvi elementi skupaj, drugi elementi skupaj. Temu zdaj appendas tvoj dodatek da dobis tole:

Koda: Izberi vse

{
{{a,b},{c,d},{e,f}},
{x,y,z},
{u,v,w}
}
in transponiras nazaj.

Lahko pa uporabis "Inner" ki je posplosen skalarni produkt - na istolezni elementih naredi nekaj, v nasem primeru Append.

Koda: Izberi vse

Inner[Append,aa,uu,List]

Odgovori