mardi 6 avril 2021

How sample from a linspace without replacement in batches

I'd like to sample n random numbers from a linspace without replacement in batches. The following code shows how I do it by calling Generator.choice repeatedly.

import numpy as np
low, high = 0, 10
sample_shape = (3,)
n = 5

rng = np.random.default_rng()  # or previously instantiated RNG
space = np.linspace(start=low, stop=high, num=1000)
samples = np.stack(
    [
        rng.choice(space, size=n, replace=False)
        for _ in range(np.prod(sample_shape, dtype=int))
    ]
)
samples = samples.reshape(sample_shape + (n,))

print(f"samples.shape: {samples.shape}")
print(samples)

Current output:

samples.shape: (3, 5)
[[4.15415415 5.56556557 1.38138138 7.78778779 7.03703704]
 [1.48148148 6.996997   0.91091091 3.28328328 2.93293293]
 [7.82782783 9.65965966 9.94994995 5.84584585 5.26526527]]

However, this procedure turns out to be a big bottleneck in my code. Is there a more efficient way of performing this?




Aucun commentaire:

Enregistrer un commentaire