2017-08-27 54 views
-1

以下Python 3.6代碼運行在Windows:Numpy/C++整數不提升爲Python整數?

print (111111, row [maxMins [deflectionIndex]]) 
print (222222, row [maxMins [deflectionIndex + 1]]) 
print (333333, row [maxMins [deflectionIndex]] - row [maxMins [deflectionIndex + 1]]) 
print (444444, 29697 - -23272) 
print (555555, origRow.dtype) 
print (666666, type (row [maxMins [deflectionIndex]]) 
a = row [maxMins [deflectionIndex]] 
print (777777, type (a)) 

其中row從numpy的陣列origRow如下得到:

row = [origRow [0]] 
    for sample in origRow [1:]: 
     while sample == row [-1]: # Avoid completely flat curve segments, since the max-min algorithm can't deal them 
      sample += 0.000001 * (ev.random() - 0.5) 
     row.append (sample) 

打印:

111111 29697 
222222 -23272 
333333 -12567 
444444 52969 
555555 int16 
666666 <class 'numpy.int16'> <class 'numpy.int16'> 
777777 <class 'numpy.int16'> 

我期望標有333333和444444的行顯示相同的計算結果。

numpy整數是否與Python整數處理方式不同? 這意味着如果我首先將一個numpy數組元素分配給一個Python變量,語義會發生變化,因爲它將被轉換爲一個Python無限長度的整數? [編輯:不!]

很明顯,他們存儲爲C + +固定長度的整數,因此可以環繞。 但是,如果C++整數的數值範圍太小,爲什麼不將它們提升爲Python整數?

+0

'29697 - -23272'這是幹什麼的?我們可以用'+'替換它嗎? – akp

+0

它從29697中減去-23272,就像上面的行一樣,只有一個完全不同的結果! –

+0

好吧。謝謝。 – akp

回答

2

您正在溢出/包裝,因爲您的數組是16位值。

對於有符號的16位變量,值52969「繞回」到-12567。當你使用numpy值進行計算時(例如你的第33333行),你會得到包裝結果。

當您使用Python類型(例如您的行44444)進行計算時,您將獲得完整的精度整數結果,而不會溢出或打包。

+0

非常感謝!即使我將它分配給Python標量變量,它也會保留numpy.int16類型。如果我把它乘以1,它會變成numpy.int32。很高興知道!因此,整個numpy類型系統確實與本地Python類型系統共存,這對我來說有一些意想不到的結果... –

+0

@Jacques,你不能給「Python標量變量」賦值。 'x = 111111'後跟'x = data [0]'不會改變原始標量。它改變了什麼'x'的引用。變量不具有類型; 'type(x)'給出'x'引用的對象的類型。 – hpaulj

+0

@hpaulj對!有時候我會忘記Python是多麼的合乎邏輯和規律的......但我仍然期望在 []索引操作以某種方式轉換該值。但當然這不可能,因爲它會使NumPy中的數組元素簡單地賦值非常緩慢。如果你仔細考慮,這一切都是非常合乎邏輯的。但是在我的應用程序中,我仍然花了好幾個小時才找到問題的原因。 –