我想要的埃普西隆下面截斷絕對值爲0,例如,Mathematica:用習慣方式替換列表中符合條件的值?
Truncate[{-3, -2, -1, 0, 1, 2, 3}, 1.5] -> {-3, -2, 0, 0, 0, 2, 3}
我想我可以使用掃描[]與[]寫一個函數,但有一個更地道「的單行」在Mathematica中使用它的方法?
我想要的埃普西隆下面截斷絕對值爲0,例如,Mathematica:用習慣方式替換列表中符合條件的值?
Truncate[{-3, -2, -1, 0, 1, 2, 3}, 1.5] -> {-3, -2, 0, 0, 0, 2, 3}
我想我可以使用掃描[]與[]寫一個函數,但有一個更地道「的單行」在Mathematica中使用它的方法?
內置的功能Chop
幾乎正是你要尋找的(它的工作的清單,在你的例子)的東西。一個潛在的驚喜是它不會截斷(截斷)整數,而只是浮點數。因此,對於您的示例工作如你所料,第一個列表轉換爲浮點與N
功能:
Chop[[email protected]{-3, -2, -1, 0, 1, 2, 3}, 1.5] -> {-3., -2., 0, 0, 0, 2., 3.}
由於Ramashalanka表演,更一般做這樣的事情,我建議:
If[Abs[#]<1.5&, 0, #]& /@ {-3, -2, -1, 0, 1, 2, 3}
即,在列表上映射的lambda函數。
很多的選擇,所有的工作:
Map[If[Abs[#] < 1.5, 0, #] &, {-3, -2, -1, 0, 1, 2, 3}]
或等價的:
If[Abs[#] < 1.5, 0, #] & /@ {-3, -2, -1, 0, 1, 2, 3}
或者,如果你喜歡:
ReplaceAll[{-3, -2, -1, 0, 1, 2, 3}, (x_ /; Abs[x] < 1.5) -> 0]
這相當於:
{-3, -2, -1, 0, 1, 2, 3} /. (x_ /; Abs[x] < 1.5) -> 0
或
ReplaceAll[{-3, -2, -1, 0, 1, 2, 3}, (x_?(Abs[#] < 1.5 &)) -> 0]
這相當於:
{-3, -2, -1, 0, 1, 2, 3} /. (x_?(Abs[#] < 1.5 &)) -> 0
這裏是一個方法(f3
),幾乎是一個數量級更快。
它由Fred Simons的代碼改編。
f1 = If[Abs[#] < 1.5, 0, #] & /@ # &;
f2 = # /. (x_ /; Abs[x] < 1.5) -> 0 &;
f3 = # (1 - [email protected][#, {-1.5, 1.5}, {0, 0}]) &;
lst = RandomInteger[{-100, 100}, 5000];
SameQ @@ (#@lst & /@ {f1, f2, f3})
[email protected]@Do[#@lst, {500}] & /@ {f1, f2, f3}
(* Out= True *)
(* Out= {0.406, 2.282, 0.047} *)
我想我可能標誌着雙方@dreeves和@ Ramashalanka的回答爲 「接受」。 @dreeves更適合我的確切問題,但@ Ramashalanka's給出了一般模式。 – 2010-02-11 18:09:38
我給你一條魚,Ramashalanka向你展示瞭如何釣魚。 :)(與此同時,我編輯了我的答案,使其更具一般性,也許現在它值得您接受的答案狀態,您慷慨授予!) – dreeves 2010-02-12 16:11:01
拉里,你看到我的回覆嗎?我意識到這是一年多以後,但如果你還在做類似的操作,它可以節省大量的計算時間。 – 2011-04-16 14:48:39