python - 将一条线拟合到python中的矩阵

标签 python arrays numpy matplotlib curve-fitting

我有一个形状为 256x256 的矩阵,我试图找到最适合的直线。顺便说一句,这是一张图片,所以这些只是强度值。假设我想通过所有强度找到最合适的线,我将如何去做? This链接描述了如何使用 svd 在 3d 数据集上执行此操作。但是我对如何将其应用于我的 numpy 数组感到困惑?

编辑:这是我用 %timeit 描述的 double 随机值的示例:

ran = [25,50,75,100,125]
for i in ran:                                                                                 
    J = np.random.random((i,i))                                                     
    y,x=np.indices(J.shape)                                                                   
    x = x.ravel()                                                                             
    y = y.ravel()                                                                             
    J=J.ravel()                                                                               
    data = np.concatenate((x[:, np.newaxis],
                          y[:, np.newaxis],
                          J[:, np.newaxis]),axis=1)        
    datamean = data.mean(axis=0)                                                              
    print "Doing %d now"  %i                                                                    
    %timeit U, S, V = np.linalg.svd(data - datamean) 

我得到以下输出:

Doing 25 now
100 loops, best of 3: 10.4 ms per loop
Doing 50 now
1 loops, best of 3: 285 ms per loop
Doing 75 now
1 loops, best of 3: 3 s per loop
Doing 100 now
1 loops, best of 3: 5.83 s per loop
Doing 125 now
1 loops, best of 3: 15.1 s per loop

编辑 2:Here's my actual array .我只是将它保存为 numpy 的 npy 格式

最佳答案

The answer you pointed out通过执行以下操作直接适用于您的问题:

import numpy as np

z = your_matrix_256_x_256
y, x = np.indices(z.shape)
x = x.ravel()
y = y.ravel()
z = z.ravel()

请注意,xy 的间隔可以通过将这些数组乘以适当的标量来重新调整。


编辑:

查看您的数据,似乎您的问题是二维曲线拟合,这可以通过 np.polyfit() 完成,如图所示在下面的示例中。

z = np.load('arr.npy').astype(np.int32)
y, x = np.indices(z.shape)
valid_z = (y.ravel()>0) & (z.ravel()>0)
x_valid = x.ravel()[valid_z]
y_valid = y.ravel()[valid_z]
z_valid = z.ravel()[valid_z]
# fitting best curve
fig = plt.figure(figsize=(5,3))
ax = fig.add_subplot(111)
ax.scatter(x_valid, y_valid, c=z_valid, alpha=0.2, s=20, edgecolor='none',
        cmap=plt.cm.jet)
# finding best-fit curve
z = np.polyfit(x_valid, y_valid, w=z_valid**0.5, deg=1)
p = np.poly1d(z)
# plotting
x_plot = np.linspace(x_valid.min(), x_valid.max(), 100)
y_plot = p(x_plot)
ax.plot(x_plot, y_plot, '-r', lw=2)
ax.set_xlim(0, x.shape[1])
ax.set_ylim(0, y.shape[0])

ax.legend(loc='lower left', frameon=False, fontsize=8)
fig.savefig('test.png', bbox_inches='tight')

给出:

enter image description here

关于python - 将一条线拟合到python中的矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26082480/

相关文章:

php - 阵列翻转碰撞问题

ruby - 在ruby中查找多维数组中每个元素的索引

Python - 从一个字符串中分配 2 个变量

python - 如何在python中对两个不同格式的向量进行运算

Python for 循环和操作

python - 如何在 Django 中创建自动递增整数字段?

带有集成包管理系统的 Python IDE

python - Django 重定向传递一个(或多个)对象作为参数

python - 用python画地形?

python - 访问存储在 pandas dataframe 中的数组