我需要一种方法来找到两个一维数组之间的最小卡方对。 例如,一个数组是
a = np.array([1, 2, 3])
另一个数组是
b = np.array([0.9, 1, 3.5, 4.5])
我们需要在b
中找到一个长度为a
的子数组,例如
sub_b = np.array([0.9, 1, 3.5])
请注意sub_b
不应包含重复的项目。
并查找两个数组之间最接近的对。我们选择chi-square = sum((a - sub_b)**2) / len(a)
。因此,我们需要找到具有最小卡方的sub_b
。
我使用iteration.permutations
查找sub_b
的所有排列,然后找到最小卡方。
from itertools import permutations
def find_chi2_array(b, a):
chi2 = lambda x: sum((x-a)**2) / len(a)
perm = np.array(list(permutations(b, len(a))))
chi2_results = np.apply_along_axis(chi2, 1, perm)
return chi2_results.min(), candidates[chi2_results.argmin()]
但是这种方法非常愚蠢,并且当b
的长度变大时,内存很快就会用完。
如果我在纯python中使用for
循环,则速度太慢。任何人都可以拥有更高效,更少内存的方法吗?
def find_chi2_array_slow(b, a):
chi2 = lambda x: sum((x-a)**2) / len(a)
n = 0
for perm in permutations(b, len(a)):
perm = np.array(perm)
n += 1
if n == 1:
chi2_result = chi2(perm)
elif chi2_result > chi2(perm):
chi2_result = chi2(perm)
return chi2_result