5

I have this list of x, y-pairs l={{x1, y1}, {x2, y2}, ...}. Now I need to flip the sign of the y values only before plotting. What is the easiest way to do this modification?

Frank Breitling
  • 217
  • 1
  • 7

6 Answers6

12

Little benchmark to compare suggested methods:

l = RandomReal[{0, 1}, {1000000, 2}];
b1[l_List] := {1, -1} # & /@ l;
b2[l_List] := Transpose@{#[[1]], -#[[2]]} &@Transpose[l];
b3[l_List] := Transpose[{1, -1} Transpose[l]];
m1[l_List] := MapAt[-# &, l, {All, 2}];
m2[l_List] := {#1, -#2} & @@@ l;
ch1[l_List] := l /. {a_, b_} :> {a, -b};
g1[l_List] := l ConstantArray[{1, -1}, Length@l];
w1[l_List] := l.{{1, 0}, {0, -1}};
fb1[l_List] := Thread[{l[[;; , 1]], -l[[;; , 2]]}];

#2 -> #1 & @@@ SortBy[#, #[[1]] &] &@({#1, #2} & @@@Transpose@{First@AbsoluteTiming[#[l]] & /@ #, #}&@{b1, b2, b3,m1, m2, ch1, g1,w1,fb1})

{w1 -> 0.007054, b3 -> 0.016369, b2 -> 0.020753, b1 -> 0.155566, fb1 -> 0.25016, g1 -> 0.323931, m2 -> 1.05527, m1 -> 1.13127, ch1 -> 1.32451}

BlacKow
  • 6,428
  • 18
  • 32
11

Dot works well here.

pts = {{x1, y1}, {x2, y2}, {x3, y3}, {x4, y4}};

pts.{{1, 0}, {0, -1}}
{{x1, -y1}, {x2, -y2}, {x3, -y3}, {x4, -y4}}

In version 10.1.0 under Windows x64 this is twice as fast as BlacKow's fastest method:

l = RandomReal[{0, 1}, {1000000, 2}];

Transpose[{1, -1} Transpose[l]]   // RepeatedTiming // First

l.{{1, 0}, {0, -1}}               // RepeatedTiming // First
0.0133

0.0072

Mr.Wizard
  • 271,378
  • 34
  • 587
  • 1,371
2
list = {{x1, y1}, {x2, y2}, {x3, y3}, {x4, y4}};

Using Threaded (new in 13.1)

list * Threaded[{1, -1}]

{{x1, -y1}, {x2, -y2}, {x3, -y3}, {x4, -y4}}

eldo
  • 67,911
  • 5
  • 60
  • 168
1

Using Cases and PauliMatrix[3]:

pts = {{x1, y1}, {x2, y2}, {x3, y3}, {x4, y4}};

Cases[pts, v_ :> v . PauliMatrix[3]]

({{x1, -y1}, {x2, -y2}, {x3, -y3}, {x4, -y4}})

E. Chan-López
  • 23,117
  • 3
  • 21
  • 44
1

I am glad to see that people are using Threaded

I am surprised nobody mentioned the use of Inner

Grabbing the list from @eldo

list = {{x1, y1}, {x2, y2}, {x3, y3}, {x4, y4}};

This

Inner[Times, list, {1, -1}, List]

returns

{{x1, -y1}, {x2, -y2}, {x3, -y3}, {x4, -y4}}

We can, also, use Splice

Cases[list, x_ :> {First@x, Splice@Rest@-x}]

{{x1, -y1}, {x2, -y2}, {x3, -y3}, {x4, -y4}}

And ApplyTo

list = {{x1, y1}, {x2, y2}, {x3, y3}, {x4, y4}};
list //= ReplaceAt[x_ :> -x, {All, 2}];
list

giving

{{x1, -y1}, {x2, -y2}, {x3, -y3}, {x4, -y4}}

bmf
  • 15,157
  • 2
  • 26
  • 63
1
list = {{x1, y1}, {x2, y2}, {x3, y3}, {x4, y4}};

SubsetMap[-# &, list, {All, 2}]
SequenceCases[list, {{a_, b_}} :> {a, -b}]
list . ReflectionMatrix[{0, 1}]

Result:

{{x1, -y1}, {x2, -y2}, {x3, -y3}, {x4, -y4}}

Syed
  • 52,495
  • 4
  • 30
  • 85