Mathematicaの:条件に一致するリストの値を置き換えるために、慣用的な方法はありますか?
-
19-09-2019 - |
質問
I 0にイプシロンの下絶対値をトランケートする、例えば、
Truncate[{-3, -2, -1, 0, 1, 2, 3}, 1.5] -> {-3, -2, 0, 0, 0, 2, 3}
私はスキャン[]とする場合、[]を使用して関数を書くことができると思いますが、Mathematicaでそれをやってより多くの慣用「ワンライナー」方法は何ですか?
解決
関数Chop
に建てほぼ正確にあなたが(それはあなたの例のように、リスト上で作業を行います)探しているものです。一つの潜在的な驚きはそれだけで浮動小数点数を、(切り捨て)整数をチョップしないということです。ご想像のとおり、あなたの例が機能するためので、最初N
機能と浮動小数点へのあなたのリストを変換します:
Chop[N@{-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}
、すなわちリスト上にマッピングされたラムダ関数
他のヒント
:すべての作業オプションの
ロット
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
)である。
これは、フレッド・シモンズによってコードから適応されます。
<時間>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} *)
所属していません StackOverflow