jak*_*sch 2 wolfram-mathematica
我有一个包含元素的列表:
数据= {{1,2},{2,7},{3,14}}
这是X和Y坐标的列表,稍后用于ListPlot.
对于所有Y坐标,我基本上想要做Y = 1/Y,所以新的列表变为:
DataNew = {{1,1/2},{2,1/7},{3,1/14}}
我该怎么办?
随data = {{1, 2}, {2, 7}, {3, 14}}我推荐:
{#, 1/#2} & @@@ data
Run Code Online (Sandbox Code Playgroud)
或者你可以使用:
Replace[data, {x_, y_} :> {x, 1/y}, {1}]
Run Code Online (Sandbox Code Playgroud)
我建议不要使用以下任何一个:
data /. {x_, y_} -> {x, 1/y}
Cases[data, {x_, y_} -> {x, 1/y}]
Run Code Online (Sandbox Code Playgroud)
两者都错误地使用Rule而不是RuleDelayed,这意味着它们无法本地化命名模式.而且,第一个并不好,因为它引入了歧义:
{{1, 2}, {2, 7}} /. {x_, y_} :> {x, 1/y}
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud){{1, 2}, {1/2, 1/7}}
第二个不那么麻烦,但恕我直言,因为它Cases是一个过滤功能,它不应该在你真正想要的地方使用Replace,因为这会使代码不那么清晰.
Leonid提醒我们,我推荐的方法不会在可能的情况下自动编译(例如Reals的打包数组).如果性能至关重要,通常使用Transpose下面比较的双重方法最快.
dat = RandomReal[99, {50000, 2}];
Do[ {#, 1/#2} & @@@ dat , {50}] // Timing
Do[ Transpose[{#, 1/#2} & @@ Transpose@dat] , {50}] // Timing
Run Code Online (Sandbox Code Playgroud)
{2.074,Null}
{0.032,Null}
| 归档时间: |
|
| 查看次数: |
151 次 |
| 最近记录: |