这种广播的正确方法是什么?

What is the right approach in this kind of broadcast?

那么,这个广播的正确做法是什么? 我使用了一个 for 循环来验证我的广播输出。 如您所见,它错过了广播第二个元素。 对此有什么想法吗?

from numpy import sum
from imageio import imread
import numpy as np
#https://github.com/glennford49/sampleImages/blob/main/cat1.png
#https://github.com/glennford49/sampleImages/blob/main/cat2.png
img1="cat1.png"
img2="cat2.png"
imageDict={}
img1=imread(img1)
img2=imread(img2)
imageDict["images1"]= (1,img1)
imageDict["images2"]=(2,img2)
listdict= list(map(lambda x:x[1], imageDict.values()))
diff= np.array(np.array(img2-listdict))
result = np.sum(diff,axis=1)/img2.size       
result = sum(result)
print("diff per pixel:",(result))
for item in diff: # verifier
    res=item / np.array(img2.size) 
    res = sum(abs(res.reshape(-1)))
    print("loop difference:",res)

打印:

diff per  pixel: 57.400979382804046 
loop difference: 57.40097938280404
loop difference: 0.0

目标:

diff per  pixel: 57.400979382804046 , 0.0
loop difference: 57.40097938280404
loop difference: 0.0

首先,np.stack 图像而不是 dictlist。这给你一个 (2, 276, 183, 3) 张量。可通过 (276, 183, 3).

广播

其次,在最后的sum中你需要避免使用sum,而是使用np.sum(axis=(1,2))。这将使 axis=0 不被求和,并为您提供您正在寻找的 2 个差值。

import numpy as np

#Replace with your cat images
img1=np.random.random((276, 183, 3))
img2=np.random.random((276, 183, 3))

imageDict["images1"]= (1,img1)
imageDict["images2"]=(2,img2)
listdict = list(map(lambda x:x[1], imageDict.values()))

diff = img2 - listdict
result = np.sum(diff, axis=1)/img2.size
result = np.sum(result, axis=(1,2))
result
array([0.00016465, 0.        ])