web-dev-qa-db-ja.com

ランダムな値を生成するときに、numpy dtypeを指定できますか?

ランダムな値のnumpy配列を作成し、32ビットの浮動小数点数を含む既存の配列にそれらを追加しています。ターゲット配列と同じdtypeを使用してランダムな値を生成したいので、dtypeを手動で変換する必要はありません。現在私はこれをしています:

import numpy as np

x = np.zeros((10, 10), dtype='f')
x += np.random.randn(*x.shape).astype('f')

最後の行の代わりにしたいのは次のようなものです:

x += np.random.randn(*x.shape, dtype=x.dtype)

randn(実際にはnumpy.randomメソッド)はdtype引数を受け入れません。

私の特定の質問は、astypeを呼び出さなくても、乱数を作成するときに乱数のdtypeを指定することは可能ですか? (私の推測では、乱数ジェネレーターは64ビット長であるため、これを行うことは実際には意味がありませんが、可能かどうか質問したいと思います。)

25
lmjohns3

Q:乱数を作成するときに、乱数のdtypeを指定することはできますか?.

A:いいえ、そうではありません。 randnは、形状をrandn(d0、d1、...、dn)としてのみ受け入れます

単にこれを試してください:

x = np.random.randn(10, 10).astype('f')

または、次のような新しい関数を定義します

np.random.randn2 = lambda *args, **kwarg: np.random.randn(*args).astype(kwarg.get('dtype', np.float64))
x = np.random.randn2(10, 10, dtype='f')

投稿でコードを使用する必要がある場合は、代わりにこのコードを試してください

x = np.zeros((10, 10), dtype='f')
x[:] = np.random.randn(*x.shape)

これにより、randnの結果がnp.zerosによって割り当てられたメモリに割り当てられます

25
emeth

Numpyがランダム整数のdtypeをサポートするようになったことから始めましょう。この機能強化は、numpyのgithubの Issue#679 で追跡できます。ただし、現在のところ、この機能はgaussian RNG。私はこれと同じ機能が必要だったので、numpy、このパッチを作成しました https://Gist.github.com/se4u/e44f631b249e0be03c21c6c898059176

パッチはfloat値の生成のサポートを追加するだけであり、他のデータ型を処理しませんが、それでも誰かに役立つかもしれません。

3
Pushpendre

np.random.randn関数は、指定された形状の配列オブジェクトを「np.float64」にランダムに初期化します。これは、次のようにして確認できます。

a = np.random.Rand(2,3)
b = a[1,2]
print (type(b))
print (type(a))

次のように出力します。

<class 'numpy.float64'>
<class 'numpy.ndarray'>
0
Shekar