3

0 から 0.5 の間で均一に分散された乱数を生成したいのですが、小数点以下 2 桁に切り捨てられます。

切り捨てなしで、私はこれが

import numpy as np
rs = np.random.RandomState(123456)
set = rs.uniform(size=(50,1))*0.5

2 dp までの乱数のみを生成する方法についての提案を手伝ってくれる人はいますか? ありがとう!

4

4 に答える 4

5

Afloatを 10 進数 2 桁に切り捨てる (または四捨五入する) ことはできません。これは、IEEE double として正確に表現できない 2 桁の値が多数あるためです。

自分の言いたいことが本当に欲しい場合は、 のように正確な精度の型を使用する必要がありますDecimal

もちろん、これにはマイナス面もありnumpyます。ユーザーにとって最も明らかなのは、 を使用する必要がありdtype=object、すべてのコンパクトさとパフォーマンスが影響を受けることです。

しかし、それはあなたが求めたことを実際に行う唯一の方法です。

ほとんどの場合、実際にやりたいことは、Joran Beasley の回答 (切り詰めずにそのままにして、印刷時に丸める) か、Lauritz V. Thauslow の回答 (可能な限り最も近い近似値を取得し、明示的なイプシロン チェックを使用する) に似たものです。どこにでも)。

あるいは、David Heffernan がコメントで示唆しているように、暗黙的に固定小数点演算を行うこともできnumpyますDecimal: 、結果の印刷用)。これにより、コストをかけずにすべての利点が得られますが、Decimalどこかに 2 つの場所をシフトするのを忘れて、新しいバグを作成する明らかなウィンドウが開きます。

于 2013-05-10T21:28:10.683 に答える
0

別の代替手段を見つけることができました:

import numpy as np
rs = np.random.RandomState(123456)
set = rs.uniform(size=(50,2))
for i in range(50):
    for j in range(2):
        set[i,j] = round(set[i,j],2)
于 2013-05-10T21:33:29.853 に答える