2016-08-27 34 views
0

我在python和numpy中遇到了非常奇怪的數組問題。首先,什麼我試着去存檔:兩個等於numpy數組的產品是不同的

1)獲取從KxTxN矩陣 2的m×n矩陣)轉置這個矩陣,計算這個轉置矩陣和原來的

的產品我得到的是一些什麼奇怪的是,代碼如下:

首先,我已經閱讀了cv2的幫助圖片,並通過3矩陣(RGB點的字段)獲得了K,然後我正在切割一個小窗口窗體它將該窗口重新塑造成M乘N矩陣:

def clipSubwindowFromImage(img, i, j, winSize): 
    winI = img[i - winSize: i + winSize + 1, j - winSize : j + winSize + 1, : ] 
    res = np.vstack((winI[:,::3,:].reshape(winI.shape[1],3), winI[:,1::3,:].reshape(winI.shape[1],3), winI[:,2::3,:].reshape(winI.shape[1],3))) 
    return res 

到目前爲止那麼神,說我們有winSize = 1, i = 1, j = 1,並得到了9×3矩陣的結果:這個矩陣:

>> subWin = clipSubwindowFromImage(background12x12b, 1, 1, 1) 
>> [[201 199 187] 
[216 219 198] 
[226 228 207] 
[243 241 228] 
[240 244 221] 
[233 235 213] 
[239 238 220] 
[238 240 216] 
[233 235 211]] 

然後,我只是想有問題的產品,這樣的:

>>r1 = subWin.T.dot(subWin) 
>>[[197 234 89] 
[234 65 163] 
[ 89 163 105]] 

嗯,這是不正確的,正確的結果應該是:

>>[[477125 479466 438361] 
[479466 481857 440483] 
[438361 440483 402793]] 

但是如果我手動初始化subWin這樣的:

>>subWin = np.array([[201, 199, 187], [216, 219, 198], [226, 228, 207], [243, 241, 228], [240, 244, 221], [233, 235, 213],[239, 238, 220], [238, 240, 216],[233, 235, 211]]) 

我得到正確的結果。

我不明白,subWin是在這兩種情況下(我檢查它)的SAME數組。有任何想法嗎?

+3

可能你的原始數據類型是int8?點乘可能被打包以匹配數據類型。分配給np.array時,它可能會被轉換爲np.float。 – Aguy

回答

3

正如@Aguy所說,你的問題來自你的數組的數據類型。 uint8數組與其他uint8數組的點積給出了一個也是uint8的數組,因此數據類型在您的情況下會溢出。下面是顯示溢出的按自己的價值觀的影響的例子:

import numpy as np 

a = np.array([[201, 199, 187], [216, 219, 198], [226, 228, 207], [243, 241, 228], [240, 244, 221], [233, 235, 213],[239, 238, 220], [238, 240, 216],[233, 235, 211]]) 
b = a.T.dot(a) 

print b.dtype 
print b 
print "overflowed uint8 :" 
print b.astype(np.uint8) 

給出:

>>> int64 
>>> [[477125 479466 438361] 
>>> [479466 481857 440483] 
>>> [438361 440483 402793]] 
>>> overflowed uint8 : 
>>> [[197 234 89] 
>>> [234 65 163] 
>>> [ 89 163 105]] 

只需改變數據類型的一個數組的東西更適合您的點積和你很好去:

r1 = subWin.T.dot(subWin.astype(np.uint32)) 
相關問題