Schnellere Version / Ersetzung von `Select []`

Sep 23 2020

Ich habe folgenden Code:

atime = AbsoluteTiming;
{a, b, n} = {2, 1, 3000};
pts = RandomReal[{-a, a}, {3/2 n, 2}]; // atime
k = b/a; // atime
pts = Map[{#[[1]], k #[[2]]} &, pts]; // atime
pts = Select[pts, (#[[1]]^2/a^2 + #[[2]]^2/b^2 <= 1) &]; // atime
pts = Take[pts, n]; // atime
Graphics[pts // Point] // atime 
Clear[a, b, n, pts, k]

was dies erzeugt:

Wir sehen, dass fast die ganze Zeit hier verbracht wurde Select[]. Gibt es eine schnellere Version / Ersatz von Select[]? (Mir ist bewusst RandomPoint[Disk[{0, 0}, {a, b}], n], aber der Punkt dieser Frage ist eine schnellere Version von Select[].)

Antworten

2 kglr Sep 23 2020 at 04:25
SeedRandom[1]
pts = RandomReal[{-a, a}, {3/2 n, 2}];

pts1 = Pick[pts, UnitStep[1 - (pts^2 .( 1/{a, b}^2))], 1]; //  atime // First
 0.0002691
pts2 = Select[pts, (#[[1]]^2/a^2 + #[[2]]^2/b^2 <= 1) &]; // atime // First
 0.0346072
pts1 == pts2
 True