簡體   English   中英

Python numpy數組:混合int32和int8時錯誤的結果

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM