[英]converting a float to decimal type in Python
我有一個隨着循環的每次迭代而增長的數組:
for i in range(100):
frac[i] = some fraction between 0 and 1 with many decimal places
一切正常。 當我檢查類型(frac [i])時 ,我被告知它是'numpy.float64' 。
為了使我的代碼盡可能精確,我需要使用十進制模塊並將每個frac [i]更改為十進制類型。
我更新了我的代碼:
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' 。
我之前設法以這種方式將其他變量更改為十進制,所以我想知道你是否可以告訴我為什么這似乎不起作用。
謝謝。
根據餾分的來源,您可能會發現使用餾分模塊是理想的選擇。 文檔中的一些示例:
>>> from fractions import Fraction
>>> Fraction(16, -10)
Fraction(-8, 5)
>>> Fraction(123)
Fraction(123, 1)
>>> Fraction()
Fraction(0, 1)
>>> Fraction('3/7')
Fraction(3, 7)
>>> Fraction(' -3/7 ')
Fraction(-3, 7)
>>> Fraction('1.414213 \t\n')
Fraction(1414213, 1000000)
>>> Fraction('-.125')
Fraction(-1, 8)
>>> Fraction('7e-6')
Fraction(7, 1000000)
>>> Fraction(2.25)
Fraction(9, 4)
>>> Fraction(1.1)
Fraction(2476979795053773, 2251799813685248)
>>> from decimal import Decimal
>>> Fraction(Decimal('1.1'))
Fraction(11, 10)
您還可以執行所有常規算術運算; 如果結果不能表示為分數,則將其轉換為float:
>>> Fraction(3, 4) + Fraction(1, 16)
Fraction(13, 16)
>>> Fraction(3, 4) * Fraction(1, 16)
Fraction(3, 64)
>>> Fraction(3, 4) ** Fraction(1, 16)
0.982180548555
注意 :我根本沒有使用過numpy
,所以下面的內容大多只是一個有根據的猜測。
聽起來你正在使用float64
類型的類型數組。 類型化數組是numpy
一個特殊功能 - Python本身的數組元素(實際列表)可以根據類型動態更改,並且不需要Python列表的所有元素具有相同的類型。
使用float64
類型數組時,您的值將被轉換為浮點值, 因為它們被分配給數組元素,撤消在此之前您對它們所做的任何類型轉換。
numpy數組創建的文檔提到默認數組類型是float64
。 您可能需要將其更改為Decimal
。
將關鍵字參數dtype=Decimal
添加到對np.arange
的調用中應該這樣做。 然后你應該有一個Decimal
類型的數組,你賦給它的任何float
或float64
值都應該轉換為Decimal。 我不知道你正在做什么,或關於numpy,知道這是一個合理的事情,做一個numpy數組。
我剛和Numpy一起玩Decimals。
我發現Numpy提供了一個名為np.vectorize的函數,它允許你獲取一個函數並將其應用於numpy數組。 在[23]中:
import numpy as np
import decimal
D = decimal.Decimal
我們將創建一個常規的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數據類型。 所以我必須以這種方式制作十進制數組。
在[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)
直到你嘗試一個trig函數,在十進制模塊中沒有相應的函數在[29]中:
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,這樣我們就可以使用十進制的量化函數來進行舍入。
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)
您還需要注意一些常規的python數學函數,因為它們會自動將返回類型更改為float。 我認為這是因為根據SIN或COS等功能無法准確計算出數字。
所以我想簡短的回答是使用列表推導來獲取並將numpy數組中的項轉換為python列表,然后從Decimal列表中創建該數組。
要返回其類型完整的numpy數組,我猜你可以使用vectorize函數來包裝任何使用Decimal類型的函數來應用於np數組。
另外,pip中有一個模塊,它提供帶有IEEE Decimals的numpy樣式數組https://pypi.python.org/pypi/decimalpy/0.1
嘗試做decimal.Decimal.from_float(frac [i])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.