0

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

我试图编写一个带参数的函数 - 我喜欢移动数组的长度列表, - 数组 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(...) 的错误消息它说“切片索引必须是整数或具有索引方法”。我想,我没有正确使用最小化函数,但不知道如何修复它。

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

谢谢你的帮助。

4

1 回答 1

0

这给出了有关 roll = np.roll(...) 的错误消息它说“切片索引必须是整数或具有索引方法”。

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)
    ...
于 2019-08-27T15:56:13.673 回答