3
$\begingroup$

I have the following list

w={{0.01,99 +0.00001414 I},{0.15,6.6370108 +0.003144129 I},{0.25,3.9515722 +0.00854493297 I},{6,0.10041 +0.28132187 I}}

and I want to ListPlot the imaginary part but with the command Im[w] I get the list

{{0,0.00001414},{0,0.00314413},{0,0.00854493},{0,0.281322}}

This way I basically lose the x axis values 0.01, 0.15, 0.25 and 6. How can I get in a list the imaginary part and the x axis values? (With Re[w] I can get the real part right, the 0.01, 0.15 etc don't change)

$\endgroup$
3
  • $\begingroup$ ListPlot[Im[Flatten@w]] Given the range you may wish to use ListLogPlot $\endgroup$
    – ubpdqn
    Commented Aug 31, 2014 at 11:21
  • $\begingroup$ @ubpdqn Thanks but I need a function to give me this: {{0.01,0.00001414},{0.15,0.00314413},{0.25,0.00854493},{6,0.281322}} not {0,0.00001414,0,0.00314413,0,0.00854493,0,0.281322}. $\endgroup$
    – epl
    Commented Aug 31, 2014 at 11:31
  • 4
    $\begingroup$ @EvPi apologies I misread your data...ListPlot[{#1, Im@#2} & @@@ w] Same comment wrt log $\endgroup$
    – ubpdqn
    Commented Aug 31, 2014 at 11:34

2 Answers 2

7
$\begingroup$

Almost a dozen alternatives with timings:

ClearAll[f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11]; 
f1[w_] := w /. {a_, Complex[_, b_]} :> {a, b};
f2[w_] := {#, Im@#2} & @@@ w; (* my favorite ... credit: ubpdqn *)
f3[w_] := w /. Complex[_, b_] :> b;
f4[w_] := MapAt[Im, w, {{All, -1}}];
f5[w_] := Module[{s = Im /@ w}, s[[All, 1]] = w[[All, 1]]; s];
f6[w_] := Module[{s = w}, s[[All, -1]] = Im /@ w[[All, -1]]; s];
f7[w_] := Transpose@{First /@ w, Im /@ Last /@ w};
f8[w_] := Transpose@{w[[All, 1]], Im /@ w[[All, -1]]};
f9[w_] := Through@{First, Composition[Im, Last]}@# & /@ w;
f10[w_] := Transpose@{First /@ w, Composition[Im, Last] /@ w};
f11[w_] := Replace[w, {x_, complex_} :> {x, Im@complex}, {1}];

f1@w
(* {{0.01`, 0.00001414`},{0.15`, 0.003144129`},{0.25`, 0.00854493297`},{6, 0.28132187`}}*)

functions = {f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11};
results = (Through@functions@w);
Equal @@ results
(* True *)

Timings:

testdata1 = Transpose[{RandomReal[100, 10000], RandomComplex[100, 10000]}];
testdata2 = Transpose[{RandomReal[100, 100000], RandomComplex[100, 100000]}];
testdata3 = Transpose[{RandomReal[100, 1000000], RandomComplex[100, 1000000]}];

Using Mr.Wizard's timeAvg function:

SetAttributes[timeAvg, HoldFirst]  
timeAvg[func_]:= Do[If[#>0.3, Return[#/5^i]] &@@ AbsoluteTiming@Do[func,{5^i}], {i, 0, 15}]

TableForm[{#, timeAvg[#@testdata1;]} & /@ functions] 

enter image description here

results = Through@functions@testdata1;
Equal @@ results
(* True *)

TableForm[{#, timeAvg[#@testdata2;]} & /@ functions]

enter image description here

results = Through@functions@testdata2;
Equal @@ results
(* True *)

TableForm[{#, timeAvg[#@testdata3;]} & /@ functions] 

enter image description here

results = Through@functions@testdata3;
Equal @@ results
(* True *)
$\endgroup$
1
  • $\begingroup$ thanks for wonderful exploration...I've never been good at efficient...and like terse...a great illustration of variety of approaches and terse!= efficient... $\endgroup$
    – ubpdqn
    Commented Sep 1, 2014 at 0:18
4
$\begingroup$
w =
 {
 {0.01, 99 + 0.00001414 I},
 {0.15, 6.6370108 + 0.003144129 I}, 
 {0.25, 3.9515722 + 0.00854493297 I},
 {6, 0.10041 + 0.28132187 I}
};

res = Replace[w, {x_, complex_} :> {x, Im @ complex}, {1}]
{{0.01, 0.00001414}, {0.15, 0.00314413}, {0.25, 0.00854493}, {6, 0.281322}}
ListLogPlot[res, PlotTheme -> "Detailed"]

enter image description here

$\endgroup$
5
  • $\begingroup$ I would use Replace instead of ReplaceAll, and also using Complex is brittle; what if the list contains complex numbers of the form r Exp[I theta]? $\endgroup$ Commented Aug 31, 2014 at 17:30
  • $\begingroup$ @TeakeNutma Why don't you publish an optimized answer? I would be the first to upvote. I tried Replace but to no avail :) $\endgroup$
    – eldo
    Commented Aug 31, 2014 at 17:49
  • $\begingroup$ If I would post an answer it'd be @ubpdqn's, so I won't :). If you want, I could update your answer with my suggestions. $\endgroup$ Commented Aug 31, 2014 at 18:06
  • $\begingroup$ @TeakeNutma Yes, please update. $\endgroup$
    – eldo
    Commented Aug 31, 2014 at 18:22
  • $\begingroup$ @TeakeNutma Thank you so much. A real learning experience. $\endgroup$
    – eldo
    Commented Aug 31, 2014 at 19:33

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.