Menghasilkan larik acak mengambang di antara rentang

90

Saya belum dapat menemukan fungsi untuk menghasilkan larik pelampung acak dengan panjang tertentu antara rentang tertentu.

Saya telah melihat Random sampling tetapi tampaknya tidak ada fungsi yang melakukan apa yang saya butuhkan.

random.uniform mendekati tetapi hanya mengembalikan satu elemen, bukan nomor tertentu.

Inilah yang saya kejar:

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

yang akan mengembalikan larik 50 pelampung non-unik acak (yaitu: pengulangan diperbolehkan) didistribusikan secara seragam dalam rentang [0.5, 13.3].

Apakah ada fungsi seperti itu?

Gabriel
sumber
5
Anda telah menandai pertanyaan tersebut numpy, tetapi Anda tidak menyebutkannya numpy.random.uniform, meskipun pertanyaan tersebut memiliki tanda panggilan yang Anda inginkan. Apakah Anda memiliki numpyperpustakaan yang tersedia?
DSM
1
[random.uniform(low, high) for i in xrange(size)]
Filogenesis
1
@DSM ya saya punya dan Anda ternyata 100% benar. Saya melewatkan fungsi itu dan tampaknya melakukan apa yang saya butuhkan. Maukah Anda menyampaikan komentar Anda sebagai jawaban?
Gabriel

Jawaban:

144

np.random.uniform cocok dengan kasus penggunaan Anda:

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

Perbarui Okt 2019:

Meskipun sintaksnya masih didukung, sepertinya API diubah dengan NumPy 1.17 untuk mendukung kontrol yang lebih besar atas generator bilangan acak. Untuk selanjutnya, API telah berubah dan Anda harus melihat https://docs.scipy.org/doc/numpy/reference/random/generated/numpy.random.Generator.uniform.html

Proposal peningkatan ada di sini: https://numpy.org/neps/nep-0019-rng-policy.html

JoshAdel
sumber
23
Pertanyaan pencarian intuitif OP adalah some_function(low=0.5, high=13.3, size=50). Begitulah cara terbaik python libs dirancang #wow
Saravanabalagi Ramachandran
Ukuran tidak sepenuhnya jelas dan tautan tidak berfungsi. Berikut adalah klarifikasi kecil. size: int atau tuple of ints, opsional. Bentuk keluaran. Jika bentuk yang diberikan adalah, misalnya, (m, n, k), maka sampel m * n * k diambil. Jika size adalah None default), satu nilai dikembalikan jika low dan high adalah skalar.
vlad
@vlad - terima kasih telah menunjukkan masalah dengan tautannya. Saya telah memperbarui jawabannya untuk mudah-mudahan mencakup penggunaan saat ini.
JoshAdel
21

Mengapa tidak menggunakan pemahaman daftar?

Dengan Python 2

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

Di Python 3, rangebekerja seperti xrange( ref )

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

Mengapa tidak menggabungkan random.uniform dengan pemahaman daftar?

>>> 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]
pkacprzak.dll
sumber
3

Mungkin sudah ada fungsi untuk melakukan apa yang Anda cari, tapi saya belum mengetahuinya (belum?). Sementara itu, saya akan menyarankan menggunakan:

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

Ini akan menghasilkan larik berbentuk (50,) dengan distribusi seragam antara 0,5 dan 13,3.

Anda juga bisa mendefinisikan sebuah fungsi:

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

EDIT : Hmm, ya, jadi saya melewatkannya, ada numpy.random.uniform () dengan panggilan yang sama persis dengan yang Anda inginkan! Coba import numpy; help(numpy.random.uniform)untuk informasi lebih lanjut.

PhilMacKay
sumber
3

Perulangan for dalam pemahaman daftar membutuhkan waktu dan membuatnya lambat. Lebih baik menggunakan parameter numpy (rendah, tinggi, ukuran, .. dll)

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)

keluaran sampel:

('butuh:', 0,06406784057617188)

('butuh:', 1.7253198623657227)

Mohamed Ibrahim
sumber
3

Atau Anda bisa menggunakan SciPy

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

dan sebagai catatan untuk contoh bilangan bulat itu

stats.randint(10, 20).rvs(50)
Stuart Hallows
sumber
2

Ini cara yang paling sederhana

np.random.uniform(start,stop,(rows,columns))
George Gee
sumber
-1

np.random.random_sample(size) akan menghasilkan float acak dalam interval setengah terbuka [0.0, 1.0).

shivaraj karki
sumber