Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

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)

share|improve this question
    
ListPlot[Im[Flatten@w]] Given the range you may wish to use ListLogPlot –  ubpdqn Aug 31 at 11:21
    
@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}. –  epl Aug 31 at 11:31
4  
@EvPi apologies I misread your data...ListPlot[{#1, Im@#2} & @@@ w] Same comment wrt log –  ubpdqn Aug 31 at 11:34

2 Answers 2

up vote 5 down vote accepted

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 *)
share|improve this answer
    
thanks for wonderful exploration...I've never been good at efficient...and like terse...a great illustration of variety of approaches and terse!= efficient... –  ubpdqn Sep 1 at 0:18
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

share|improve this answer
    
+1 neat and like the plot theme –  ubpdqn Aug 31 at 11:52
    
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]? –  Teake Nutma Aug 31 at 17:30
    
@TeakeNutma Why don't you publish an optimized answer? I would be the first to upvote. I tried Replace but to no avail :) –  eldo Aug 31 at 17:49
    
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. –  Teake Nutma Aug 31 at 18:06
    
@TeakeNutma Yes, please update. –  eldo Aug 31 at 18:22

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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