web-dev-qa-db-ja.com

範囲間のフロートのランダム配列を生成します

特定の範囲内の特定の長さのランダムな浮動小数点数の配列を生成する関数を見つけることができませんでした。

ランダムサンプリング を見てきましたが、必要な機能を果たす関数はありません。

random.uniform が近づきますが、特定の数値ではなく、単一の要素のみを返します。

これは私が望んでいることです:

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

これは、[0.5, 13.3]の範囲に均一に分布する50個のランダムな非一意のフロートの配列を返します(つまり、繰り返しが許可されます)。

そのような機能はありますか?

48
Gabriel

np.random.uniformはユースケースに適合します: http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.uniform.html

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

リスト内包表記を使用してみませんか?

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

リスト内包のforループは時間がかかり、遅くなります。 numpyパラメーター(low、high、size、.. 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
Mohamed Ibrahim

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
pkacprzak

あるいは、 SciPy を使用することもできます

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

レコードが整数をサンプリングするためには

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

あなたが探していることをする関数が既にあるかもしれませんが、私はそれについて知りません(まだ?)。それまでの間、私は以下を使用することを提案します:

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

EDIT:うーん、ええ、私はそれを逃しました、あなたが望むのと同じ正確な呼び出しを持つnumpy.random.uniform()があります!詳細については、import numpy; help(numpy.random.uniform)を試してください。

2
PhilMacKay

これが最も簡単な方法です

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