Mathematica - List - manipuliranje s podatki

O matematiki, številih, množicah in računih...
Post Reply
User avatar
fogl
Posts: 545
Joined: 7.11.2004 20:25
Location: Radovljica

Mathematica - List - manipuliranje s podatki

Post by fogl » 6.7.2009 13:30

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
Posts: 320
Joined: 25.12.2002 17:01

Re: Mathematica - List - manipuliranje s podatki

Post by Marjan » 6.7.2009 17:28

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}

User avatar
Aniviller
Posts: 7263
Joined: 15.11.2004 18:16

Re: Mathematica - List - manipuliranje s podatki

Post by Aniviller » 6.7.2009 21:06

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

User avatar
fogl
Posts: 545
Joined: 7.11.2004 20:25
Location: Radovljica

Re: Mathematica - List - manipuliranje s podatki

Post by fogl » 28.9.2010 7:51

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?

User avatar
fogl
Posts: 545
Joined: 7.11.2004 20:25
Location: Radovljica

Re: Mathematica - List - manipuliranje s podatki

Post by fogl » 28.9.2010 11:32

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

Code: Select all

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:

Code: Select all

{{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?

User avatar
Aniviller
Posts: 7263
Joined: 15.11.2004 18:16

Re: Mathematica - List - manipuliranje s podatki

Post by Aniviller » 28.9.2010 17:28

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:

Code: Select all

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

Code: Select all

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).

User avatar
fogl
Posts: 545
Joined: 7.11.2004 20:25
Location: Radovljica

Re: Mathematica - List - manipuliranje s podatki

Post by fogl » 30.9.2010 8:47

Sem poskusil vse variante, ampak deluje samo ena. Klik

User avatar
Aniviller
Posts: 7263
Joined: 15.11.2004 18:16

Re: Mathematica - List - manipuliranje s podatki

Post by Aniviller » 30.9.2010 10:07

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.

User avatar
fogl
Posts: 545
Joined: 7.11.2004 20:25
Location: Radovljica

Re: Mathematica - List - manipuliranje s podatki

Post by fogl » 30.9.2010 10:49

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.

User avatar
Aniviller
Posts: 7263
Joined: 15.11.2004 18:16

Re: Mathematica - List - manipuliranje s podatki

Post by Aniviller » 30.9.2010 11:14

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:

Code: Select all

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:

Code: Select all

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

Code: Select all

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

User avatar
fogl
Posts: 545
Joined: 7.11.2004 20:25
Location: Radovljica

Re: Mathematica - List - manipuliranje s podatki

Post by fogl » 30.9.2010 11:31

1000x hvala :D

User avatar
fogl
Posts: 545
Joined: 7.11.2004 20:25
Location: Radovljica

Re: Mathematica - List - manipuliranje s podatki

Post by fogl » 4.10.2010 10:08

Š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?

User avatar
Aniviller
Posts: 7263
Joined: 15.11.2004 18:16

Re: Mathematica - List - manipuliranje s podatki

Post by Aniviller » 4.10.2010 14:13

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

Code: Select all

{
{{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:

Code: Select all

{
{{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.

Code: Select all

Inner[Append,aa,uu,List]

Post Reply