【发布时间】:2015-01-07 18:15:26
【问题描述】:
我正在研究一些图像分析算法,并尝试使用 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))
现在,这代表我的 3 维图像,其中我有 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 是 3 维数组,我不知道如何告诉它它需要在前两个维度上广播。
【问题讨论】:
-
看the source和documentation,我不确定
numpy.linalg.lstsq是否支持广播。但是,在您的测试用例中,您可以使用支持广播的np.linalg.solve -
很遗憾,solve 对设计矩阵的限制有点过多,导致我很难使用。我在通过正确的轴进行广播时也遇到了问题。因此,使用solve,我在处理单个像素时得到了正确的答案,但在使用最后一个示例时得到了错误的答案。
标签: python arrays numpy broadcast least-squares