我有元素的列表:通過應用於每個元素的操作創建新列表?
數據= {{1,2},{2,7},{3,14}}
這是X和Y的列表座標,稍後用於ListPlot。
對於所有的Y座標我基本上想要做Y = 1/Y,這樣一個新的列表變爲:
DataNew = {{1,} 1/2,{2} 1/7 ,{3,1/14}}
我該怎麼做這樣的事情?
我有元素的列表:通過應用於每個元素的操作創建新列表?
數據= {{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}};
newData = data /. {x_, y_} -> {x, 1/y}
或
newData = Cases[data, {x_, y_} -> {x, 1/y}]
或
f[{a_, b_}] := {a, 1/b};
newData = f /@ data
和其他可能性的無數。
請記住以小寫字母開始所有您定義的名稱!
您可以使用:
{#[[1]], 1/#[[2]]} & /@ Data
隨着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
,因爲這會讓代碼不太清晰。
列昂尼德提醒我們,我推薦的方法不會在情況下,這是可能的(如雷亞爾的封裝陣列)自動編譯。如果性能很關鍵,那麼使用下面比較的雙重方法通常是最快的。
dat = RandomReal[99, {50000, 2}];
Do[ {#, 1/#2} & @@@ dat , {50}] // Timing
Do[ Transpose[{#, 1/#2} & @@ [email protected]] , {50}] // Timing
{2.074,空}
{0.032,空}
+1,但請記住'@@@'不會自動編譯。 –
@Leonid我添加了另一種方法來解決性能問題。 –
一個很好的補充。我也同意'@@@'看起來更好,通常可以在需要時調整性能。 –
很抱歉,但我必須反對票此。在我的答案中給出了推理。 –