Stran 1 od 1

Mathematica - List - manipuliranje s podatki

Objavljeno: 6.7.2009 13:30
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?

Re: Mathematica - List - manipuliranje s podatki

Objavljeno: 6.7.2009 17:28
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}

Re: Mathematica - List - manipuliranje s podatki

Objavljeno: 6.7.2009 21:06
Napisal/-a Aniviller
Transpose[{x,y}]
Da dobis nazaj "x" pa se enkrat transponiras in vzames prvi element.

Re: Mathematica - List - manipuliranje s podatki

Objavljeno: 28.9.2010 7:51
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?

Re: Mathematica - List - manipuliranje s podatki

Objavljeno: 28.9.2010 11:32
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?

Re: Mathematica - List - manipuliranje s podatki

Objavljeno: 28.9.2010 17:28
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).

Re: Mathematica - List - manipuliranje s podatki

Objavljeno: 30.9.2010 8:47
Napisal/-a fogl
Sem poskusil vse variante, ampak deluje samo ena. Klik

Re: Mathematica - List - manipuliranje s podatki

Objavljeno: 30.9.2010 10:07
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.

Re: Mathematica - List - manipuliranje s podatki

Objavljeno: 30.9.2010 10:49
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.

Re: Mathematica - List - manipuliranje s podatki

Objavljeno: 30.9.2010 11:14
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.

Re: Mathematica - List - manipuliranje s podatki

Objavljeno: 30.9.2010 11:31
Napisal/-a fogl
1000x hvala :D

Re: Mathematica - List - manipuliranje s podatki

Objavljeno: 4.10.2010 10:08
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?

Re: Mathematica - List - manipuliranje s podatki

Objavljeno: 4.10.2010 14:13
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]