Bir aralık arasında rastgele yüzen dizi oluşturun


90

Belirli bir aralık arasında belirli bir uzunlukta rastgele kayan sayılar dizisi oluşturacak bir işlev bulamadım.

Rastgele örneklemeye baktım ama hiçbir işlev ihtiyacım olanı yapmıyor.

random.uniform yaklaşır ancak belirli bir sayı değil, yalnızca tek bir öğe döndürür.

Peşinde olduğum şey bu:

ran_floats = some_function(low=0.5, high=13.3, size=50)

bu, aralıkta tekdüze olarak dağıtılmış 50 rastgele benzersiz olmayan kayan nokta dizisi döndürür (yani: tekrarlara izin verilir) [0.5, 13.3].

Böyle bir işlev var mı?


5
Soruyu etiketlediniz numpy, ancak numpy.random.uniformtam olarak istediğiniz arama imzasına sahip olmasına rağmen bahsetmediniz . Eğer var mı numpykütüphane mevcuttur?
DSM

1
[random.uniform(low, high) for i in xrange(size)]
Phylogenesis

1
@DSM evet bende ve görünüşe göre% 100 haklısın. Bu işlevi kaçırdım ve tam olarak ihtiyacım olanı yapıyor gibi görünüyor. Yorumunuzu bir cevap olarak sunabilir misiniz?
Gabriel

Yanıtlar:


144

np.random.uniform kullanım durumunuza uyar:

sampl = np.random.uniform(low=0.5, high=13.3, size=(50,))

Ekim 2019 Güncellemesi:

Sözdizimi hala desteklenirken, rasgele sayı üreteci üzerinde daha fazla kontrolü desteklemek için API NumPy 1.17 ile değiştirilmiş gibi görünüyor. İleriye dönük olarak API değişti ve https://docs.scipy.org/doc/numpy/reference/random/generated/numpy.random.Generator.uniform.html adresine bakmalısınız.

Geliştirme önerisi burada: https://numpy.org/neps/nep-0019-rng-policy.html


23
OP'nin sezgisel arama sorusu some_function(low=0.5, high=13.3, size=50). Python kütüphaneleri bu kadar iyi tasarlandı #wow
Saravanabalagi Ramachandran

Boyut tamamen net değildi ve bağlantı çalışmıyor. İşte küçük bir açıklama. boyut: int veya tuple of int, isteğe bağlı. Çıktı şekli. Verilen şekil, örneğin (m, n, k) ise, m * n * k örnekleri çizilir. Boyut varsayılan olarak Yok ise), hem düşük hem de yüksek skaler ise tek bir değer döndürülür.
vlad

@vlad - bağlantıyla ilgili soruna işaret ettiğiniz için teşekkürler. Cevabı mevcut kullanımı kapsayacak şekilde güncelledim.
JoshAdel

21

Neden bir liste anlayışı kullanmıyorsunuz?

Python 2'de

ran_floats = [random.uniform(low,high) for _ in xrange(size)]

Python 3'te ( ref ) rangegibi çalışırxrange

ran_floats = [random.uniform(low,high) for _ in range(size)]

3

Neden random.uniform ile liste anlayışını birleştirmeyelim ?

>>> def random_floats(low, high, size):
...    return [random.uniform(low, high) for _ in xrange(size)]
... 
>>> random_floats(0.5, 2.8, 5)
[2.366910411506704, 1.878800401620107, 1.0145196974227986, 2.332600336488709, 1.945869474662082]

3

Aradığınızı yapmak için zaten bir işlev olabilir, ancak bunu bilmiyorum (henüz?). Bu arada, şunu kullanmanızı öneririm:

ran_floats = numpy.random.rand(50) * (13.3-0.5) + 0.5

Bu, 0,5 ile 13,3 arasında düzgün bir dağılımla bir şekil dizisi (50,) üretecektir.

Ayrıca bir işlev de tanımlayabilirsiniz:

def random_uniform_range(shape=[1,],low=0,high=1):
    """
    Random uniform range

    Produces a random uniform distribution of specified shape, with arbitrary max and
    min values. Default shape is [1], and default range is [0,1].
    """
    return numpy.random.rand(shape) * (high - min) + min

DÜZENLEME : Hmm, evet, bu yüzden kaçırdım, tam olarak istediğiniz aramaya sahip numpy.random.uniform () var! Daha import numpy; help(numpy.random.uniform)fazla bilgi için deneyin .


3

Listedeki for döngüsü zaman alır ve onu yavaşlatır. Numpy parametrelerini kullanmak daha iyidir (düşük, yüksek, boyut, ..vb)

import numpy as np
import time
rang = 10000
tic = time.time()
for i in range(rang):
    sampl = np.random.uniform(low=0, high=2, size=(182))
print("it took: ", time.time() - tic)

tic = time.time()
for i in range(rang):
    ran_floats = [np.random.uniform(0,2) for _ in range(182)]
print("it took: ", time.time() - tic)

örnek çıktı:

('aldı:', 0,06406784057617188)

('aldı:', 1.7253198623657227)


3

Alternatif olarak SciPy'yi kullanabilirsiniz

from scipy import stats
stats.uniform(0.5, 13.3).rvs(50)

ve tam sayıları örneklemek için kayıt için

stats.randint(10, 20).rvs(50)


-1

np.random.random_sample(size) yarı açık aralık [0.0, 1.0) içinde rastgele kayan değerler üretecektir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.