使用numpy.linalg.lstsq广播问题

时间:2015-01-07 18:15:26

标签: python arrays numpy broadcast least-squares

我正在研究一些图像分析算法,并尝试使用numpy进行最小二乘拟合。为了说明我想要做的事情,我创建了一个非常简单的测试用例:

A = np.zeros((2, 2))
A[0, 0] = 1
A[0, 1] = 3
A[1, 0] = 4
A[0, 1] = 5

所以这是我在Ax = b型方程式中的简单A矩阵。

现在,在这个测试案例中,我的图像基本上是一个简单的2x2图像,在每个点上我有2个测量值。所以,在我的情况下,我按如下方式模拟它:

x = np.array([[13, 24], [13, 24], [13, 24], [13, 24]])
x = x.reshape((2,2,2))

现在,这代表我的三维图像,其中我有2x2网格和两个与每个像素相关联的值。我可以逐像素地解决这个问题;

np.linalg.lstsq(A, x[0, 0, :]) # fit at pixel (0, 0)

np.linalg.lstsq(A, x[0, 1, :]) # fit at pixel (0, 1)

但是,只要我尝试这样的话:

np.linalg.lstsq(A, x) # fit at all pixels together

它抱怨x是三维数组,我不知道如何告诉它需要在前两个维度上进行广播。

1 个答案:

答案 0 :(得分:1)

使用列中的像素值对重塑{{​​1}}以获得形状(2,K)。调用lstsq,然后恢复结果的形状。

例如,这里有xA

x

In [86]: A Out[86]: array([[ 1., 5.], [ 4., 0.]]) In [87]: x Out[87]: array([[[0, 1], [2, 3]], [[4, 5], [6, 7]]]) 重塑为x,并在列中添加像素值:

y

In [88]: y = x.reshape(-1,2).T In [89]: y Out[89]: array([[0, 2, 4, 6], [1, 3, 5, 7]]) 是我们y所需的形状:

lstsq

抓住解决方案,然后恢复形状以匹配In [90]: result = np.linalg.lstsq(A, y) In [91]: result[0] Out[91]: array([[ 0.25, 0.75, 1.25, 1.75], [-0.05, 0.25, 0.55, 0.85]])

x

通过单独解决几个像素来检查解决方案是否符合我们的预期:

In [92]: sol = result[0].T.reshape(x.shape)

In [93]: sol
Out[93]: 
array([[[ 0.25, -0.05],
        [ 0.75,  0.25]],

       [[ 1.25,  0.55],
        [ 1.75,  0.85]]])