Version plus rapide / remplacement de `Select []`

Sep 23 2020

J'ai le code suivant:

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]

qui produit ceci:

Nous voyons que presque tout le temps ici a été consacré Select[]. Existe-t-il une version / remplacement plus rapide de Select[]? (Je suis au courant RandomPoint[Disk[{0, 0}, {a, b}], n], mais le but de cette question concerne une version plus rapide de Select[].)

Réponses

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