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

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]