イプシロン未満の絶対値を 0 に切り捨てたい。たとえば、
Truncate[{-3, -2, -1, 0, 1, 2, 3}, 1.5] -> {-3, -2, 0, 0, 0, 2, 3}
Scan[] と If[] を使用して関数を記述できると思いますが、Mathematica でそれを行うより慣用的な「ワンライナー」の方法はありますか?
イプシロン未満の絶対値を 0 に切り捨てたい。たとえば、
Truncate[{-3, -2, -1, 0, 1, 2, 3}, 1.5] -> {-3, -2, 0, 0, 0, 2, 3}
Scan[] と If[] を使用して関数を記述できると思いますが、Mathematica でそれを行うより慣用的な「ワンライナー」の方法はありますか?
すべてが機能する多くのオプション:
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
組み込み関数Chop
は、探しているものとほぼ同じです(例のように、リストで機能します)。潜在的な驚きの 1 つは、浮動小数点数のみを切り捨て (切り捨て) 整数を切り捨てないことです。したがって、例が期待どおりに機能するようにするには、まずN
関数を使用してリストを浮動小数点に変換します。
Chop[N@{-3, -2, -1, 0, 1, 2, 3}, 1.5] -> {-3., -2., 0, 0, 0, 2., 3.}
ラマシャランカが示すように、この種のことをより一般的に行うには、次のことをお勧めします。
If[Abs[#]<1.5&, 0, #]& /@ {-3, -2, -1, 0, 1, 2, 3}
つまり、リストにマップされたラムダ関数です。
f3
これは、ほぼ桁違いに高速なメソッド ( ) です。
Fred Simons によるコードから改作されています。
f1 = If[Abs[#] < 1.5, 0, #] & /@ # &;
f2 = # /. (x_ /; Abs[x] < 1.5) -> 0 &;
f3 = # (1 - Unitize@Clip[#, {-1.5, 1.5}, {0, 0}]) &;
lst = RandomInteger[{-100, 100}, 5000];
SameQ @@ (#@lst & /@ {f1, f2, f3})
First@Timing@Do[#@lst, {500}] & /@ {f1, f2, f3}
(* Out= True *)
(* Out= {0.406, 2.282, 0.047} *)