我想從下面的代碼中洗掉 for 回圈。在我的用例中, 的值n通常會大得多,其中 200-700 范圍內的值并不少見,并且不方便將它們全部列出來,并且再添加一個回圈只會使效率降低。
import numpy as np
n = 3
imgs = np.random.random((16,9,9,n))
transform = np.random.uniform(low=0.0, high=1.0, size=(n,n))
for img in imgs:
for channel in range(img.shape[2]):
temp1 = img[:,:,0]
temp2 = img[:,:,1]
temp3 = img[:,:,2]
temp = temp1 * transform[channel][0] temp2 * transform[channel][1] temp3 * transform[channel][2]
img[:,:,channel] = temp/3
任何指標將不勝感激。
uj5u.com熱心網友回復:
我認為您可以完全避免內部回圈。
根據我的理解,您將transform矩陣的點積與矩陣的轉置[temp1 temp2 temp3]相乘,然后將其除以 3。
以下是影像中相同的表示:

因此,所有這些實際上都可以在 for 回圈本身之外完成。代碼看起來像這樣。PS還在一些感覺不一致的地方編輯了變數名稱。
import numpy as np
n = 3
imgs = np.random.random((16,9,9,n))
transform = np.random.uniform(low=0.0, high=1.0, size=(n,n))
for img in imgs:
temp_arr = img[:,:, 0:3]
img[:,:, 0:3] = np.dot(temp_arr, np.transpose(transform))/3
將結果與您的結果進行比較,并給出相同的輸出
uj5u.com熱心網友回復:
切片可能無法以您認為的方式應用,但是numba您可以獲得一些有效的東西,而無需添加另一個 for 回圈。
此代碼執行與您提供的代碼相同的操作。
import numpy as np
from numba import njit
@njit
def mult_arrays_values( array, values, n):
temp = np.zeros((array.shape[0], array.shape[1], n))
for i in range(n):
temp[:,:,i] = array[:,:,i] * values[i]
return temp
n = 3
imgs = np.random.random((16,9,9,n))
transform = np.random.uniform(low=0.0, high=1.0, size=(n,n))
for img in imgs:
for channel in range(img.shape[2]):
temp = mult_arrays_values(img[:,:,:], transform[channel][:], n)
temp = np.add.reduce(temp , axis=2)
img[:,:,channel] = temp/n
uj5u.com熱心網友回復:
你也可以使用 numpy.einsum
In [77]: tr = np.arange(9).reshape((3,3))
...: imgs = np.arange(24).reshape((2,2,2,3)).transpose((1,0,2,3))
...: print('original imgs\n', imgs)
...: for img in imgs:
...: img[:,:,:] = np.dot(img, tr.T)
...: print('imgs after loop\n', imgs)
...: imgs = np.arange(24).reshape((2,2,2,3)).transpose((1,0,2,3))
...: print('result of einsum\n', np.einsum('ijkl,ml', imgs, tr))
original imgs
[[[[ 0 1 2]
[ 3 4 5]]
[[12 13 14]
[15 16 17]]]
[[[ 6 7 8]
[ 9 10 11]]
[[18 19 20]
[21 22 23]]]]
imgs after loop
[[[[ 5 14 23]
[ 14 50 86]]
[[ 41 158 275]
[ 50 194 338]]]
[[[ 23 86 149]
[ 32 122 212]]
[[ 59 230 401]
[ 68 266 464]]]]
result of einsum
[[[[ 5 14 23]
[ 14 50 86]]
[[ 41 158 275]
[ 50 194 338]]]
[[[ 23 86 149]
[ 32 122 212]]
[[ 59 230 401]
[ 68 266 464]]]]
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/352467.html
上一篇:為什么matlab中的psnr函式會為被柯西噪聲損壞的影像回傳負值?
下一篇:如何使這個回圈并行且更快?
