2017-02-19 80 views
0

對於一些輸入,我得到了兩個不同的結果,但其他輸入卻沒有。讓我用具體的例子來解釋。我有以下功能:使用numpy陣列時出現奇怪的結果

In [86]: def f(x, p): 
    ...:  n = len(p) 
    ...:  tot = 0 
    ...:  for i in range(n): 
    ...:   tot += p[i] * x**(n-i-1) 
    ...:  return tot 

p是非常小的值的數組:

In [87]: p 
Out[87]: 
array([ -3.93107522e-45, 9.17048746e-40, -8.11593366e-35, 
     3.05584286e-30, -1.06065846e-26, -3.03946945e-21, 
     1.05944707e-16, -1.56986924e-12, 1.07293061e-08, 
     -3.22670121e-05, 1.12072912e-01]) 

現在考慮輸出:

In [90]: [f(i, p) for i in range(11, 20)] 
Out[90]: 
[0.11171927108787173, 
0.1116872502272328, 
0.1116552507123586, 
0.11162327253386167, 
0.11159131568235707, 
0.11155938014846242, 
0.1115274659227979, 
0.11149557299598616, 
0.11146370135865244] 

In [88]: [f(i, p) for i in np.array(range(11, 20))] 
Out[88]: 
[0.11171927108787173, 
0.1116872502272328, 
0.1116552507123586, 
0.11162327253386167, 
0.11159131568235707, 
0.11155938014846242, 
0.1115274659227979, 
0.11149557299598616, 
0.11146370135865244] 

正如你所看到的,這些輸出是完全他們應該是相同的。唯一的區別是,在一種情況下,我使用range(a, b),而在另一種情況下,我將該範圍轉換爲numpy數組。

但現在,讓我們改變範圍內的值:

In [91]: [f(i, p) for i in range(50001, 50010)] 
Out[91]: 
[-0.011943965521167818, 
-0.011967640114171604, 
-0.011991315947644229, 
-0.012014993019120554, 
-0.012038671327427961, 
-0.012062350870605351, 
-0.012086031644648818, 
-0.012109713648648865, 
-0.012133396879791744] 

In [92]: [f(i, p) for i in np.array(range(50001, 50010))] 
Out[92]: 
[491.26519430165808, 
491.32457916465478, 
491.38395932037008, 
491.38726606180143, 
491.44663641006275, 
491.50600185375316, 
491.56536239249812, 
491.56864971072332, 
491.6280006336612] 

而且他們還差得遠呢!我錯過了一些可笑簡單的東西嗎?

+1

這看起來像一個整數範圍問題。在較新的Python版本中,int有無限的範圍,你可以通過輸入一些像10 ** 100-1這樣荒謬的東西來檢查。 numpy整數是C long,所以它們不提供這種奢侈品。 –

回答

2

你錯過了普通Python整數是任意精度的事實,而NumPy整數是固定大小的。

此:

x**(n-i-1) 

溢出與NumPy的輸入。

+0

我明白了。那麼補救措施是什麼,因爲我在實際代碼中有numpy數組。實際上,這是一個熊貓系列。 – Peaceful

+0

@Peaceful:使用浮點數。 – user2357112

1

在錯誤情況下,f(x, p)中的值爲x,類型爲numpy.int32。他們可以溢出。在這種情況下的修復是相對直接的,將值轉換爲int

tot += p[i] * np.asarray(x).astype(int) ** (n - i - 1) 
+0

當'x'作爲一個numpy數組傳遞時,這可能不起作用。對? – Peaceful

+0

嗯。然而,它在我的情況下引發錯誤:'TypeError:只有長度爲1的數組可以轉換爲Python標量' – Peaceful

+0

謝謝,更新... –