我隻是在玩數字遊戲。
我發現Numpy提供了一個名為np.vectorize的函數,允許您擷取一個函數并将其應用于Numpy數組。
在[23]中:import numpy as np
import decimal
D = decimal.Decimal
我們将建立一個正常的np浮點數組
在[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将數組轉換為十進制類型不起作用。似乎嘗試使用np.asarray并指定decimal.decimal類型會将數組設定為預期的object,但如果實際通路數組的單個元素,則它仍然具有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]
如果給np.array一個十進制類型的同質python清單,則它似乎保留了該類型,請參閱下面的清單了解,以獲得第一個數組中作為十進制資料類型的值的清單。是以我不得不這樣做十進制數組。
在[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)
in ()
----> 1 np.sin(D10)
AttributeError: 'Decimal' object has no attribute 'sin'
是以讓我們使用np.vectorize,這樣我們就可以使用decimal的量化函數來進行舍入。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清單,然後從小數清單中建立該數組。
要傳回類型完整的numpy數組,我想您可以使用vectorize函數包裝任何使用Decimal類型的函數以應用于np數組。