Mathematicaの:条件に一致するリストの値を置き換えるために、慣用的な方法はありますか?

StackOverflow https://stackoverflow.com/questions/2241716

質問

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} *)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top