gpt4 book ai didi

python - 查找较小数组与较大数组最匹配的位置

转载 作者:行者123 更新时间:2023-12-01 07:03:41 26 4
gpt4 key购买 nike

我需要找到较小的二维数组 array1 与另一个二维数组 array2 中最接近的位置。

  • array1 的大小为 grid_size 46x46 到 96x96。

  • array2 将更大 (184x184)。

我只能访问 numpy。

我目前正在尝试使用 Tversky formula但我并没有被它束缚。

效率是最重要的部分,因为这会运行很多次。我当前的解决方案如下所示,速度非常慢。

for i in range(array2.shape[0] - grid_size):
for j in range(array2.shape[1] - grid_size):
r[i, j] = np.sum(array2[i:i+grid_size, j:j+grid_size] == array1 ) / (np.sum(array2[i:i+grid_size, j:j+grid_size] != array1 ) + np.sum(Si[i:i+grid_size, j:j+grid_size] == array1 ))

编辑:目标是找到较小图像与另一图像匹配的位置。

最佳答案

这是一种基于 FFT/卷积的方法,可最小化欧几里德距离:

import numpy as np
from numpy import fft

N = 184
n = 46
pad = 192

def best_offs(A,a):
A,a = A.astype(float),a.astype(float)
Ap,ap = (np.zeros((pad,pad)) for _ in "Aa")
Ap[:N,:N] = A
ap[:n,:n] = a
sim = fft.irfft2(fft.rfft2(ap).conj()*fft.rfft2(Ap))[:N-n+1,:N-n+1]
Ap[:N,:N] = A*A
ap[:n,:n] = 1
ref = fft.irfft2(fft.rfft2(ap).conj()*fft.rfft2(Ap))[:N-n+1,:N-n+1]
return np.unravel_index((ref-2*sim).argmin(),sim.shape)

# example
# random picture
A = np.random.randint(0,256,(N,N),dtype=np.uint8)
# random offset
offy,offx = np.random.randint(0,N-n+1,2)
# sub pic at random offset
# randomly flip half of the least significant 75% of all bits
a = A[offy:offy+n,offx:offx+n] ^ np.random.randint(0,64,(n,n))

# reconstruct offset
oyrec,oxrec = best_offs(A,a)
assert offy==oyrec and offx==oxrec

# speed?
from timeit import timeit
print(timeit(lambda:best_offs(A,a),number=100)*10,"ms")

# example with zero a
a[...] = 0
# make A smaller in a matching subsquare
A[offy:offy+n,offx:offx+n]>>=1

# reconstruct offset
oyrec,oxrec = best_offs(A,a)
assert offy==oyrec and offx==oxrec

示例运行:

3.458537160186097 ms

关于python - 查找较小数组与较大数组最匹配的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58532123/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com