1

ループの反復ごとに成長する配列があります。

for i in range(100):
    frac[i] = some fraction between 0 and 1 with many decimal places

これはすべてうまくいきます。type(frac[i])を確認すると、 「numpy.float64」であると言われます。

コードを必要なだけ正確にするには、decimal モジュールを使用し、各frac[i]を decimal 型に変更する必要があります。

コードを更新しました:

for i in range(100):
    frac[i] = some fraction between 0 and 1 with many decimal places

    frac[i] = decimal.Decimal(frac[i])

しかし、タイプを確認すると、frac[i]'numpy.float64'であると言われます。

以前にこの方法で他の変数を 10 進数に変更したことがあるので、なぜこれが機能しないように見えるのか教えていただけないでしょうか。

ありがとうございました。

4

4 に答える 4

1

私は Numpy で Decimals をいじっていました。

Numpy が np.vectorize という関数を提供していることがわかりました。これにより、関数を取得して numpy 配列に適用できます。[23]:

import numpy as np

import decimal

D = decimal.Decimal

</p>

通常の np float 配列を作成します

[24]:

f10 = np.random.ranf(10)

f10

アウト[24]:

array([ 0.45410583,  0.35353919,  0.5976785 ,  0.12030978,  0.00976334,
        0.47035594,  0.76010096,  0.09229687,  0.24842551,  0.30564141])

np.asarray を使用して配列を Decimal 型に変換しようとしても機能しません。np.asarray を使用して decimal.Decimal 型を指定しようとすると、配列がオブジェクトに設定されますが、実際に配列の個々の要素にアクセスすると、まだ float データ型になります。[25]:

f10todec = np.asarray(f10, dtype = decimal.Decimal)

print f10todec.dtype, f10todec

print type(f10todec[0])

object [0.454105831376884 0.3535391906233327 0.5976785016396975 0.1203097778312584
 0.009763339031407026 0.47035593879363524 0.7601009625324361
 0.09229687387940333 0.24842550566826282 0.30564141425653435]
<type 'float'>

np.array に Decimal 型の同種の python リストを指定すると、型が保持されているように見えます。以下のリスト内包表記を使用して、最初の配列の値のリストを Decimal データ型として取得します。したがって、この方法で10進配列を作成する必要がありました。

[26]:

D10 = np.array([D(d) for d in f10])

D10

アウト[26]:

array([Decimal('0.4541058313768839838076019077561795711517333984375'),
       Decimal('0.35353919062333272194109667907468974590301513671875'),
       Decimal('0.597678501639697490332991947070695459842681884765625'),
       Decimal('0.12030977783125840208100498784915544092655181884765625'),
       Decimal('0.00976333903140702563661079693702049553394317626953125'),
       Decimal('0.47035593879363524205672320022131316363811492919921875'),
       Decimal('0.76010096253243608632743644193396903574466705322265625'),
       Decimal('0.09229687387940332943259136300184763967990875244140625'),
       Decimal('0.24842550566826282487653543284977786242961883544921875'),
       Decimal('0.30564141425653434946951847450691275298595428466796875')], dtype=object)

基本的な数学演算は正常に機能しているようです

[27]:

D10/2

アウト[27]:

array([Decimal('0.2270529156884419919038009539'),
       Decimal('0.1767695953116663609705483395'),
       Decimal('0.2988392508198487451664959735'),
       Decimal('0.06015488891562920104050249392'),
       Decimal('0.004881669515703512818305398469'),
       Decimal('0.2351779693968176210283616001'),
       Decimal('0.3800504812662180431637182210'),
       Decimal('0.04614843693970166471629568150'),
       Decimal('0.1242127528341314124382677164'),
       Decimal('0.1528207071282671747347592373')], dtype=object)

[28]:

np.sqrt(D10)

アウト[28]:

array([Decimal('0.6738737503248542354573624759'),
       Decimal('0.5945916166776426405934196108'),
       Decimal('0.7730966961769384578392278689'),
       Decimal('0.3468569991095154505863255680'),
       Decimal('0.09880961001545864636229121433'),
       Decimal('0.6858250059553349663476168402'),
       Decimal('0.8718376927688066448819998853'),
       Decimal('0.3038040057000620415496242404'),
       Decimal('0.4984230187985531079935481296'),
       Decimal('0.5528484550548498633920483390')], dtype=object)

[29] では、decimal モジュールに対応する関数がない三角関数を試すまで:

np.sin(D10)
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)

<ipython-input-29-31ba62da35b8> in <module>()
----> 1 np.sin(D10)

AttributeError: 'Decimal' object has no attribute 'sin'

np.vectorize を使用して、decimal の quantize 関数を使用して丸めを行うことができます。

In [30]:

    npquantize = np.vectorize(decimal.Decimal.quantize)

    qnt_D10 = npquantize(D10, D('.000001'))

    qnt_D10

Out[30]:

    array([Decimal('0.454106'), Decimal('0.353539'), Decimal('0.597679'),
           Decimal('0.120310'), Decimal('0.009763'), Decimal('0.470356'),
           Decimal('0.760101'), Decimal('0.092297'), Decimal('0.248426'),
           Decimal('0.305641')], dtype=object)

また、戻り値の型を float に自動的に変更するため、一部の通常の python 数学関数についても注意する必要があります。これは、SINやCOSなどの関数に基づいて数値を正確に計算できないためだと思います。

したがって、短い答えは、リスト内包表記を使用して、numpy 配列内の項目を取得して python リストに変換し、Decimals のリストからその配列を作成することだと思います。

numpy 配列をそのままの型で返すには、ベクトル化関数を使用して Decimal 型で動作する関数をラップし、np 配列に適用できると思います。

ちなみに、ピップには、IEEE Decimals を使用した numpy スタイルの配列を提供するモジュールがありますhttps://pypi.python.org/pypi/decimalpy/0.1

于 2015-04-10T05:22:29.613 に答える
1

: 私はまったく使用numpyしていないので、以下は主に経験に基づいた推測にすぎません。

type の型付き配列を使用しているようですfloat64。型付き配列は特定の機能ですnumpy— Python 自体の配列 (実際にはリスト) の要素は型から型へと動的に変更でき、Python リストのすべての要素が同じ型である必要はありません。

-type 配列を使用すると、値が配列要素に割り当てられるときfloat64に値が float にキャストされ、その時点までに行った型キャストが元に戻されます。

numpy 配列作成のドキュメントfloat64には、デフォルトの配列タイプが. おそらく、これを に変更する必要がありますDecimal

これを行うには、キーワード引数dtype=Decimalを呼び出しに追加しnp.arangeます。次に、 type の配列が必要Decimalであり、それに割り当てたfloatまたは値は Decimal にキャストする必要があります。float64あなたが何をしているのか、またはnumpyについて十分に知りません。これがnumpy配列で行うのが賢明なことかどうかを知ることができません。

于 2013-08-31T22:46:15.990 に答える