[英]Python numpy array: wrong result when mixing int32 and int8
我在numpy數組中看到了一個非常奇怪的行為,當我在一個簡單的操作中將int32和int8數組混合時,當采用+= dleng[4]*4
的結果時,int32數組元素ct[4,0]
似乎已變為8bit。 :
import numpy as np
In[3]: ct = np.zeros((6,1), np.int32)
In[4]: ct
Out[4]:
array([[0],
[0],
[0],
[0],
[0],
[0]], dtype=int32)
In[5]: dleng = np.zeros((6, 1), np.int8)
In[6]: dleng[0] = 2
dleng[1] = 3
dleng[2] = 4
dleng[3] = 7
dleng[4] = 3
dleng[5] = 5
In[7]: dleng
Out[7]:
array([[2],
[3],
[4],
[7],
[3],
[5]], dtype=int8)
In[8]: ct[4] = 117
In[9]: ct
Out[9]:
array([[ 0],
[ 0],
[ 0],
[ 0],
[117],
[ 0]], dtype=int32)
In[10]: ct[4,0] += dleng[4]*4
In[11]: ct
Out[11]:
array([[ 0],
[ 0],
[ 0],
[ 0],
[-127],
[ 0]], dtype=int32)}
有誰知道為什么會這樣?
這是因為您正在做的是:
>>> ct[4,0] += dleng[4]*4
實際上是這樣的:
>>> ct[4,0] = ct[4,0] + dleng[4]*4
產生此:
>>> ct[4,0] + dleng[4]*4
array([-127], dtype=int8)
然后執行以下操作:
>>> ct[4,0] = array([-127], dtype=int8)
但是實際上是在進行這種類型的轉換:
>>> a.astype(np.int32)
array([-127], dtype=int32)
dleng[4]*4
是一個數組 :
In [94]: dleng[4]
Out[94]: array([3], dtype=int8)
In [95]: dleng[4]*4
Out[95]: array([12], dtype=int8)
而ct[4, 0]
np.int32
ct[4, 0]
是類型為np.int32
的標量 :
In [98]: ct[4,0]
Out[98]: 117
In [99]: type(_)
Out[99]: numpy.int32
正如@WallyBeaver指出的那樣, ct[4,0] += dleng[4]*4
就像ct[4,0] = ct[4,0] + dleng[4]*4
。 最后一個表達式是一個標量加一個數組 。 在這種情況下,數據類型由數組確定,因此最終為np.int8
。 numpy docs中對此有一個注釋:
混合標量數組操作使用一組不同的強制轉換規則,以確保標量不能“上載”數組,除非標量與數據類型的根本不同(即,數據類型層次結構中的層次結構不同)。數組。 此規則使您可以在代碼中使用標量常量(作為Python類型,在ufunc中進行相應地解釋),而不必擔心標量常量的精度是否會導致大型(小精度)數組上的轉換。
解決方法是將就地添加內容寫為
ct[4,0] += dleng[4,0]*4
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.