2

我有一个包含元素的列表:

数据 = {{1, 2}, {2, 7}, {3, 14}}

这是 X 和 Y 坐标的列表,稍后用于 ListPlot。

对于所有 Y 坐标,我基本上想做 Y = 1 / Y,所以一个新列表变为:

DataNew={{1, 1/2}, {2, 1/7}, {3, 1/14}}

我该怎么做这样的事情?

4

3 回答 3

6

data = {{1, 2}, {2, 7}, {3, 14}}建议:

{#, 1/#2} & @@@ data

或者,您可以使用:

Replace[data, {x_, y_} :> {x, 1/y}, {1}]

我建议不要使用以下任何一种:

data /. {x_, y_} -> {x, 1/y}

Cases[data, {x_, y_} -> {x, 1/y}]

两者都错误地使用Rule而不是RuleDelayed,这意味着它们无法本地化命名模式。此外,第一个不好,因为它引入了歧义:

{{1, 2}, {2, 7}} /. {x_, y_} :> {x, 1/y}
{{1, 2}, {1/2, 1/7}}

第二个不那么麻烦,但恕我直言,因为Cases它是一个过滤功能,它不应该在你真正想要的地方使用Replace,因为这会使代码不太清晰。


Leonid 提醒我们,我推荐的方法在可能的情况下不会自动编译(例如实数的打包数组)。如果性能很关键,通常使用Transpose下面比较的双重方法是最快的。

dat = RandomReal[99, {50000, 2}];

Do[ {#, 1/#2} & @@@ dat , {50}] // Timing

Do[ Transpose[{#, 1/#2} & @@ Transpose@dat] , {50}] // Timing

{2.074,空}

{0.032,空}

于 2012-09-15T15:58:26.050 回答
5

您可以使用 :

{#[[1]], 1/#[[2]]} & /@ Data
于 2012-09-11T16:03:39.607 回答
3

Also for example:

data = {{1, 2}, {2, 7}, {3, 14}};
newData = data /. {x_, y_} -> {x, 1/y}

or

newData = Cases[data, {x_, y_} -> {x, 1/y}]

or

f[{a_, b_}] := {a, 1/b};
newData = f /@ data

and zillions of other possibilities.

Remember to start all your defined names with lowercase letters!

于 2012-09-11T16:47:01.010 回答