<p>@Dillman击败了我。也许你仍然可以使用下面的方法来构造它。我喜欢分步思考</p>
<pre><code>import numpy as np
Z= np.random.randint(low=0,high=256,size=(6,3)) # assume just 3 images with 6 pixels each
print(f' Z= {Z}')
lEks=np.random.rand(3)
print(f'lEks = {lEks}')
g0=np.arange(255) #some example mapping; here from byte to half byte
g= g0//2 # // integer division
npxl,nimage=np.shape(Z)
print(f'npxl={npxl} nimage={nimage}')
# vectorize just one operation at first, easier to visualize
hdr=np.zeros(npxl)
for i in np.arange(npxl):
#print(Z[i])
denom=np.sum(Z[i])
hdr[i]= np.sum(Z[i] *(g[Z[i]]- lEks))/denom
# Z[i] is just a vector of length 3, just like lEks
print(hdr)
# this would do it, but still be slower than necessary, as your remaining loop has many more elements that
# the one we dealt with
# now vectorize the other coordinate (remove the remaining for-loop)
hdr=np.zeros(npxl)
hdr= np.sum(Z *(g[Z]- lEks), axis=1)/ np.sum(Z,axis=1) # which axis to sum over is critical
print(hdr)
#final code
def genHDR(Z, g, lEks):
npxl,nimage=np.shape(Z)
hdr=np.zeros(npxl)
hdr= np.sum(Z *(g[Z]- lEks), axis=1)/ np.sum(Z,axis=1)
return hdr
print(genHDR(Z,g,lEks))
</code></pre>
<p>输出:</p>
<pre><code> Z= [[199 101 67]
[134 16 137]
[219 5 135]
[153 19 17]
[238 41 120]
[ 93 50 179]]
lEks = [0.57778608 0.18113957 0.85257974]
npxl=6 nimage=3
[72.94714613 63.50130665 91.04028102 62.58551969 90.46303414 65.97390417]
[72.94714613 63.50130665 91.04028102 62.58551969 90.46303414 65.97390417]
[72.94714613 63.50130665 91.04028102 62.58551969 90.46303414 65.97390417]
</code></pre>