迭代所有组合
iterate for all combinations
我正在执行一个操作,其中我取两张图像的平均值,一张图像是固定的,第二张图像是我迭代的,我怎样才能对所有组合执行相同的操作?喜欢
mean(img1,img1), mean(img1,img2), mean(img1,img3) ... mean(img2,img1), mean(img2,img2), mean(img2,img3) ... mean(img3,img1), mean(img3,img2)mean(img3,img3)
k=[]
for i in range(image.shape[-1]):
k = (np.mean(image[:, :, 102], img[:, :, i]))
result.append(k)
谢谢!
这是一种获取数组 'image' 中每两个图像的所有组合的均值的方法。其中 'means' 的切片 [:, :, i, j]
是图像 i 和图像 j 的平均值。
import numpy as np
image = np.random.randint(0, 5, (2, 2, 3))
means = (image[:, :, None, :] + image[:, :, :, None])/2
输出:
image =
[[[3 1 3]
[3 4 4]]
[[2 2 1]
[0 3 0]]]
means =
[[[[3. 2. 3. ]
[2. 1. 2. ]
[3. 2. 3. ]]
[[3. 3.5 3.5]
[3.5 4. 4. ]
[3.5 4. 4. ]]]
[[[2. 2. 1.5]
[2. 2. 1.5]
[1.5 1.5 1. ]]
[[0. 1.5 0. ]
[1.5 3. 1.5]
[0. 1.5 0. ]]]]
您可以按如下顺序进行:
import numpy as np
from itertools import combinations
n_images = 4
imsz = 2
images = np.random.normal(size=(n_images, imsz, imsz))
image_combinations = combinations(range(images.shape[0]), 2)
means = []
for combo in image_combinations:
#print(combo)
means.append( (images[combo[0],:,:] + images[combo[1],:,:]) /2)
means = np.array(means)
means.shape
现在,根据图像的数量和大小,开销可能相对较大,但我找不到真正矢量化操作的方法(那将是一个重大改进)。事实上,你可以做一些事情,比如你做 all 组合(包括自身和两个方向(1,2),(2,1))然后,你去这个矩阵中获取你想要的那些。
all_means = (images[:,np.newaxis, :,:] + images[np.newaxis,:,:,:]) /2
image_combinations = combinations(range(images.shape[0]), 2)
relevant_means = []
for combo in image_combinations:
relevant_means.append(all_means[combo[0], combo[1], :,:])
relevant_means = np.array(relevant_means)
对于 10 个 2x2 图像,第二个解决方案的时钟速度似乎快了 2 倍以上。但是内存占用也增加了2倍多,所以天下没有白吃。
希望对您有所帮助。
我正在执行一个操作,其中我取两张图像的平均值,一张图像是固定的,第二张图像是我迭代的,我怎样才能对所有组合执行相同的操作?喜欢
mean(img1,img1), mean(img1,img2), mean(img1,img3) ... mean(img2,img1), mean(img2,img2), mean(img2,img3) ... mean(img3,img1), mean(img3,img2)mean(img3,img3)
k=[]
for i in range(image.shape[-1]):
k = (np.mean(image[:, :, 102], img[:, :, i]))
result.append(k)
谢谢!
这是一种获取数组 'image' 中每两个图像的所有组合的均值的方法。其中 'means' 的切片 [:, :, i, j]
是图像 i 和图像 j 的平均值。
import numpy as np
image = np.random.randint(0, 5, (2, 2, 3))
means = (image[:, :, None, :] + image[:, :, :, None])/2
输出:
image =
[[[3 1 3]
[3 4 4]]
[[2 2 1]
[0 3 0]]]
means =
[[[[3. 2. 3. ]
[2. 1. 2. ]
[3. 2. 3. ]]
[[3. 3.5 3.5]
[3.5 4. 4. ]
[3.5 4. 4. ]]]
[[[2. 2. 1.5]
[2. 2. 1.5]
[1.5 1.5 1. ]]
[[0. 1.5 0. ]
[1.5 3. 1.5]
[0. 1.5 0. ]]]]
您可以按如下顺序进行:
import numpy as np
from itertools import combinations
n_images = 4
imsz = 2
images = np.random.normal(size=(n_images, imsz, imsz))
image_combinations = combinations(range(images.shape[0]), 2)
means = []
for combo in image_combinations:
#print(combo)
means.append( (images[combo[0],:,:] + images[combo[1],:,:]) /2)
means = np.array(means)
means.shape
现在,根据图像的数量和大小,开销可能相对较大,但我找不到真正矢量化操作的方法(那将是一个重大改进)。事实上,你可以做一些事情,比如你做 all 组合(包括自身和两个方向(1,2),(2,1))然后,你去这个矩阵中获取你想要的那些。
all_means = (images[:,np.newaxis, :,:] + images[np.newaxis,:,:,:]) /2
image_combinations = combinations(range(images.shape[0]), 2)
relevant_means = []
for combo in image_combinations:
relevant_means.append(all_means[combo[0], combo[1], :,:])
relevant_means = np.array(relevant_means)
对于 10 个 2x2 图像,第二个解决方案的时钟速度似乎快了 2 倍以上。但是内存占用也增加了2倍多,所以天下没有白吃。
希望对您有所帮助。