สร้างอาร์เรย์แบบสุ่มของการลอยระหว่างช่วง


90

ฉันไม่พบฟังก์ชันในการสร้างอาร์เรย์ของการลอยแบบสุ่มที่มีความยาวที่กำหนดระหว่างช่วงหนึ่ง

ฉันได้ดูการสุ่มตัวอย่างแบบสุ่มแต่ดูเหมือนว่าไม่มีฟังก์ชันใดที่จะทำในสิ่งที่ฉันต้องการ

random.uniform เข้ามาใกล้ แต่จะส่งกลับเพียงองค์ประกอบเดียวไม่ใช่ตัวเลขเฉพาะ

นี่คือสิ่งที่ฉันต้องการ:

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

ซึ่งจะกลับอาร์เรย์ของ 50 ลอยที่ไม่ซ้ำกันสุ่ม (เช่น: ซ้ำได้รับอนุญาต) [0.5, 13.3]กระจายอย่างสม่ำเสมอในช่วง

มีฟังก์ชั่นดังกล่าวหรือไม่?


5
คุณได้ติดแท็กคำถามnumpyแต่คุณไม่ได้พูดถึงnumpy.random.uniformแม้ว่าจะมีลายเซ็นการโทรที่คุณต้องการก็ตาม คุณมีnumpyห้องสมุดหรือไม่?
DSM

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

1
@DSM ใช่ฉันมีและเห็นได้ชัดว่าคุณถูกต้อง 100% ฉันพลาดฟังก์ชั่นนั้นและดูเหมือนว่าจะทำในสิ่งที่ฉันต้องการ คุณช่วยเสนอความคิดเห็นเป็นคำตอบได้ไหม
Gabriel

คำตอบ:


144

np.random.uniform เหมาะกับกรณีการใช้งานของคุณ:

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

อัปเดตตุลาคม 2019:

แม้ว่าจะยังรองรับไวยากรณ์ แต่ดูเหมือนว่า API จะเปลี่ยนไปด้วย NumPy 1.17 เพื่อรองรับการควบคุมตัวสร้างตัวเลขสุ่มได้ดีขึ้น ต่อไป API มีการเปลี่ยนแปลงและคุณควรดูที่https://docs.scipy.org/doc/numpy/reference/random/generated/numpy.random.Generator.uniform.html

ข้อเสนอการปรับปรุงอยู่ที่นี่: https://numpy.org/neps/nep-0019-rng-policy.html


23
คำถามการค้นหาที่ใช้งานง่าย OP some_function(low=0.5, high=13.3, size=50)คือ นั่นเป็นวิธีที่ python libs ออกแบบมาได้ดี #wow
Saravanabalagi Ramachandran

ขนาดไม่ชัดเจนและลิงก์ไม่ทำงาน นี่คือคำชี้แจงเล็กน้อย ขนาด: int หรือ tuple ของ ints เป็นทางเลือก รูปร่างเอาต์พุต ถ้ารูปร่างที่กำหนดคือเช่น (m, n, k) จะมีการวาดตัวอย่าง m * n * k ถ้าขนาดเป็นค่าเริ่มต้นไม่มี) ค่าเดียวจะถูกส่งกลับหากต่ำและสูงเป็นสเกลาร์ทั้งคู่
vlad

@vlad - ขอบคุณที่ชี้ให้เห็นปัญหาด้วยลิงค์ ฉันได้อัปเดตคำตอบเพื่อหวังว่าจะครอบคลุมการใช้งานปัจจุบัน
JoshAdel

21

ทำไมไม่ใช้ความเข้าใจในรายการ?

ใน Python 2

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

ใน Python 3 rangeทำงานเหมือนxrange( ref )

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

3

ทำไมไม่รวมrandom.uniformเข้ากับความเข้าใจรายการ?

>>> 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

อาจมีฟังก์ชั่นที่จะทำในสิ่งที่คุณกำลังมองหาอยู่แล้ว แต่ฉันไม่รู้เกี่ยวกับมัน (ยัง?) ในระหว่างนี้ฉันจะใช้:

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

สิ่งนี้จะสร้างอาร์เรย์ของรูปร่าง (50,) โดยมีการกระจายสม่ำเสมอระหว่าง 0.5 ถึง 13.3

คุณยังสามารถกำหนดฟังก์ชัน:

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

แก้ไข : อืมใช่ฉันพลาดไปแล้วมี numpy.random.uniform () ที่มีสายเดียวกันกับที่คุณต้องการ! ลองimport numpy; help(numpy.random.uniform)ดูข้อมูลเพิ่มเติม


3

ความเข้าใจสำหรับการวนซ้ำในรายการต้องใช้เวลาและทำให้ช้า จะดีกว่าถ้าใช้พารามิเตอร์ numpy (ต่ำ, สูง, ขนาด, .. ฯลฯ )

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)

ตัวอย่างผลลัพธ์:

('เอา:', 0.06406784057617188)

('เอา:', 1.7253198623657227)


3

หรือคุณสามารถใช้SciPy

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

และสำหรับเร็กคอร์ดตัวอย่างจำนวนเต็ม

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


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.