我在python和numpy中使用数组时遇到了非常奇怪的问题。首先,我试图存档的是:
1)从KxTxN矩阵中获取MxN矩阵 2)转置该矩阵并计算该转置矩阵和原始矩阵的乘积
我得到的是一些奇怪的,这里是代码:
首先,我在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
得到了一个9x3矩阵:这个矩阵:
>> 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数组(我检查了它)。有任何想法吗?
答案 0 :(得分: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))