RE: a little more complex list operation
- To: mathgroup at smc.vnet.net
- Subject: [mg40256] RE: [mg40237] a little more complex list operation
- From: "David Park" <djmp at earthlink.net>
- Date: Fri, 28 Mar 2003 04:31:09 -0500 (EST)
- Sender: owner-wri-mathgroup at wolfram.com
Nathan,
Mathematica is great at this stuff and if you expect to do a lot of it you
should read up on Map and pure functions.
data = {{x1, y1}, {x2, y2}, {x3, y3}};
{f[First[#]], g[Last[#]]} & /@ data
{{f[x1], g[y1]}, {f[x2], g[y2]}, {f[x3], g[y3]}}
Another method that has a pure function with another pure function inside.
MapThread[#1[#2] &, {{f, g}, #}] & /@ data
{{f[x1], g[y1]}, {f[x2], g[y2]}, {f[x3], g[y3]}}
Here is an example with specific functions, squaring for f and Cos for g. We
have more pure functions embedded. Remember that a pure function stands in
the place of a name of a function.
(MapThread[#1[#2] & , {{#1^2 & , Cos}, #1}] & ) /@ data
{{x1^2, Cos[y1]}, {x2^2, Cos[y2]}, {x3^2, Cos[y3]}}
Probably not as efficient for long data lists is
data /. {x_, y_} :> {f[x], g[y]}
{{f[x1], g[y1]}, {f[x2], g[y2]}, {f[x3], g[y3]}}
I don't know exactly what you mean by "applying only one transform". It is
probably not
f[data]
f[{{x1, y1}, {x2, y2}, {x3, y3}}]
nor
f /@ data
{f[{x1, y1}], f[{x2, y2}], f[{x3, y3}]}
but more likely
Map[f, data, {2}]
{{f[x1], f[y1]}, {f[x2], f[y2]}, {f[x3], f[y3]}}
or
f @@ # & /@ data
{f[x1, y1], f[x2, y2], f[x3, y3]}
You can see that there are many ways of manipulating data lists with
Mathematica. The ability of functional programming to manipulate data
structures is one of Mathematica's neatest features.
David Park
djmp at earthlink.net
http://home.earthlink.net/~djmp/
From: Nathan Moore [mailto:nmoore at physics.umn.edu]
To: mathgroup at smc.vnet.net
Thanks very much for all the previous replies. Another simple question -
though I guess this will require more complex syntax. Suppose I have the
list,
data = {{x1,y1},{x2,y2},{x3,y3}}
and I want to produce the result (for fitting/plotting)
data2 = {{f[x1],g[y1]},{f[x2],g[y2]},{f[x3],g[y3]}}
I assume that if there was only one transform I wanted to apply, f[x],
then I could say
data2 = f[data]
but how about this more complicated transform with functions f and g?
again thanks! Your replies have been very helpful!
Nathan Moore, University of Minnesota Physics