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}}

2つ目はそれほど面倒ではありませんが、IMHOはフィルタリング関数であるため、コードがわかりにくく Casesなるため、本当に必要な場所では使用しないでください。Replace


Leonidは、私が推奨する方法は、それが可能な場合(Realのパックされた配列など)には自動コンパイルされないことを思い出させてくれます。パフォーマンスが重要な場合は、通常、Transpose以下に比べてdoubleメソッドを使用するのが最も高速です。

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

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

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

{2.074、Null}

{0.032、Null}

于 2012-09-15T15:58:26.050 に答える
5

あなたが使用することができます:

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

また、例えば:

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

また

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

また

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

そして他の無数の可能性。

定義した名前はすべて小文字で始めることを忘れないでください。

于 2012-09-11T16:47:01.010 に答える