迭代所有组合

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倍多,所以天下没有白吃。

希望对您有所帮助。