Numpy数组的最小差异

Minimum difference of Numpy arrays

我有两个相同大小的 3 维 Numpy 数组。他们的条目相似,但不完全相同。我想在所有三个 space 维度上移动一个数组,以便两个数组之间的差异最小。

我试着写了一个带参数的函数 - 我喜欢移动数组的长度列表, - 数组 1, - 阵列 2。 但我不知道如何最小化此功能,我尝试使用 scipy.optimize.minimize,但失败了:

import numpy as np
from scipy.optimize import minimize


def array_diff(shift, array1, array2):
    roll = np.roll(np.roll(np.roll(array2, shift[0], axis=0), shift[1], axis=1), shift[2], axis=2)
    diff = np.abs(np.subtract(array1, roll))
    diffs = np.sum(diff)
    return diffs

def opt_diff(func, array1, array2):
    opt = minimize(func, x0=np.zeros(3), args=(array1, array2))
    return opt


min_diff = opt_diff(array_diff, array1, array2) 

这给出了关于 roll = np.roll(...) 的错误消息,它说 "slice indices must be integers or have an index method"。我想,我没有正确使用最小化功能,但不知道如何修复它。

我的目标是最小化函数img_diff并得到差分数组所有条目的最小总和。因此,我想要三个参数 shift[0]、shift[1] 和 shift[2],用于在 y、x 和 z 方向上移动。

感谢您的帮助。

This gives an error message regarding roll = np.roll(...) It says "slice indices must be integers or have an index method".

np.roll 需要 shift 参数的整数。 np.zeros 创建一个浮点数组。为 x0 指定整数类型:

x0=np.zeros(3,dtype=np.int32)

x0=np.zeros(3)

x0
Out[3]: array([ 0.,  0.,  0.])

x0[0]
Out[4]: 0.0

x0=np.zeros(3,dtype=np.int32)

x0[0]
Out[6]: 0

scipy.optimize.minimize 将尝试通过 分数 调整 x0 所以也许只需在 array_diff:

中添加一个语句
def array_diff(shift, array1, array2):
    shift = shift.astype(np.int32)
    ...