Python 两个相等numpy数组的乘积不同

Python 两个相等numpy数组的乘积不同,python,arrays,numpy,Python,Arrays,Numpy,我在python和numpy中遇到了非常奇怪的数组问题。首先,我要归档的是: 1) 从KxTxN矩阵中获取MxN矩阵 2) 将此矩阵转置,并计算此转置矩阵与原始矩阵的乘积 我得到的是一些奇怪的东西,下面是代码: 首先,我在cv2的帮助下读取了一幅图像,得到了K×T×3矩阵(一个RGB点的区域),然后我从中切割了一个小窗口,并将该窗口重塑为m×N矩阵: def clipSubwindowFromImage(img, i, j, winSize): winI = img[i - winSiz

我在python和numpy中遇到了非常奇怪的数组问题。首先,我要归档的是:

1) 从KxTxN矩阵中获取MxN矩阵 2) 将此矩阵转置,并计算此转置矩阵与原始矩阵的乘积

我得到的是一些奇怪的东西,下面是代码:

首先,我在cv2的帮助下读取了一幅图像,得到了K×T×3矩阵(一个RGB点的区域),然后我从中切割了一个小窗口,并将该窗口重塑为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  
>> 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]]
到目前为止,上帝,假设我们有
winSize=1,i=1,j=1
,结果得到了一个9x3的矩阵:这个矩阵:

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  
>> 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]]
>>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]])
这不对,正确的结果应该是:

>>[[477125 479466 438361]
 [479466 481857 440483]
 [438361 440483 402793]]
但是如果我像这样手动初始化subWin
subWin

>>r1 = subWin.T.dot(subWin)
>>[[197 234  89]
 [234  65 163]
 [ 89 163 105]]
>>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
在这两种情况下都是相同的数组(我检查了它)。有什么想法吗

正如@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]]
只需将一个阵列的数据类型更改为更适合您的dot产品的数据类型,即可:

r1 = subWin.T.dot(subWin.astype(np.uint32))

正如@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]]
只需将一个阵列的数据类型更改为更适合您的dot产品的数据类型,即可:

r1 = subWin.T.dot(subWin.astype(np.uint32))

您的原始数据类型可能是int8吗?可以包装点乘以匹配数据类型。当分配给np.array时,它可能被强制转换为np.float。您的原始数据类型可能是int8吗?可以包装点乘以匹配数据类型。当分配给np.array时,它可能被强制转换为np.float。