범위 사이에 임의의 부동 소수점 배열 생성


88

특정 범위 사이에서 주어진 길이의 임의의 부동 소수점 배열을 생성하는 함수를 찾을 수 없었습니다.

무작위 샘플링을 살펴 보았지만 필요한 기능을 수행하는 기능이없는 것 같습니다.

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)]
계통 발생

1
@DSM 네, 제가 가지고 있고 당신은 분명히 100 % 정확합니다. 나는 그 기능을 놓 쳤고 내가 필요한 것을 정확히 수행하는 것처럼 보입니다. 귀하의 의견을 답변으로 제시해 주시겠습니까?
Gabriel

답변:


135

np.random.uniform 사용 사례에 적합 :

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

2019 년 10 월 업데이트 :

구문은 여전히 ​​지원되지만 난수 생성기에 대한 더 많은 제어를 지원하기 위해 NumPy 1.17에서 API가 변경된 것처럼 보입니다. 앞으로 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)입니다. 이것이 파이썬 라이브러리가 얼마나 잘 설계되었는지입니다. #wow
Saravanabalagi Ramachandran

크기가 완전히 명확하지 않고 링크가 작동하지 않습니다. 여기에 약간의 설명이 있습니다. size : int 또는 int의 튜플, 선택 사항. 출력 모양. 주어진 모양이 예를 들어 (m, n, k)이면 m * n * k 샘플이 그려집니다. 크기가 기본값 없음 인 경우 낮음과 높음이 모두 스칼라이면 단일 값이 반환됩니다.
vlad

@vlad-링크 문제를 지적 해 주셔서 감사합니다. 현재 사용법을 다룰 수 있도록 답변을 업데이트했습니다.
JoshAdel

20

목록 이해력을 사용하지 않는 이유는 무엇입니까?

Python 2에서

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

Python 3에서는 ( ref ) range와 같이 작동합니다.xrange

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

3

random.uniform 과 list comprehension 을 결합하지 않는 이유는 무엇 입니까?

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

이렇게하면 0.5와 13.3 사이의 균일 한 분포를 가진 모양 배열 (50,)이 생성됩니다.

함수를 정의 할 수도 있습니다.

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

목록 이해의 for 루프는 시간이 걸리고 느리게 만듭니다. numpy 매개 변수 (낮음, 높음, 크기, ..etc)를 사용하는 것이 좋습니다.

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)

2

이것은 가장 간단한 방법입니다

np.random.uniform(start,stop,(rows,columns))

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.