【问题标题】:python arrays: averaging slope and intercept of datasetspython数组:平均数据集的斜率和截距
【发布时间】:2023-03-04 11:45:02
【问题描述】:

我在实现以下目标时遇到了一些困难。假设我有两组从测试中获得的数据:

    import numpy as np
    a = np.array([[0.0, 1.0, 2.0, 3.0], [0.0, 2.0, 4.0, 6.0]]).T
    b = np.array([[0.5, 1.5, 2.5, 3.5], [0.5, 1.5, 2.5, 3.5]]).T

第 0 列中的数据代表(在我的情况下)位移,第 1 列中的数据代表各自的测量力值。

(给定数据表示两条斜率分别为 2 和 1 的线,两者的 y 截距均为 0。)

现在我正在尝试编写一个脚本来平均这两个数组,尽管 x 值不匹配,这样它就会产生

    c = [0.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5], [0.0, 0.75, 1.5,
         2.25, 3.0, 3.75, 4.5, 5.25]]).T

(斜率为 1.5,y 截距为 0 的直线。)

我尽力使用切片和线性插值,但我似乎无法理解它(我是初学者)。


我很乐意提供任何输入和提示,并希望我提供给您的信息足够!

提前致谢,

罗伯特

【问题讨论】:

  • 当你说列时,你能说清楚你的意思吗?说 a[0] 和 a[1] 的第 n 个元素或其他东西。你有两组数据,a 和 b,但我不知道从 a 内或 b 内的两组数据之间的比较。

标签: python python-3.x numpy


【解决方案1】:

您可以获取每个数据集的系数(斜率和截距),获取平均值,并将该数据拟合到新的 x 值数组。

一步一步:

使用 polyfit 将 deg-1 多项式拟合到每个数组 ab 以获得每个数组的系数(斜率和截距):

coef_a = np.polyfit(a[:,0], a[:,1], deg=1)

coef_b = np.polyfit(b[:,0], b[:,1], deg=1)

>>> coef_a
array([  2.00000000e+00,   2.22044605e-16])
>>> coef_b
array([  1.00000000e+00,   1.33226763e-15])

获取这些系数的平均值以用作c 的系数:

coef_c = np.mean(np.stack([coef_a,coef_b]), axis=0)

>>> coef_c
array([  1.50000000e+00,   7.77156117e-16])

使用np.arange为 c 创建新的 x 值

c_x = np.arange(0,4,0.5)

>>> c_x
array([ 0. ,  0.5,  1. ,  1.5,  2. ,  2.5,  3. ,  3.5])

使用polyval 将新的c 系数与新的x 值相匹配:

c_y = np.polyval(coef_c, c_x)

>>> c_y
array([  7.77156117e-16,   7.50000000e-01,   1.50000000e+00,
         2.25000000e+00,   3.00000000e+00,   3.75000000e+00,
         4.50000000e+00,   5.25000000e+00])

使用stackc_xc_y 值放在一起:

c = np.stack([c_x, c_y])

>>> c
array([[  0.00000000e+00,   5.00000000e-01,   1.00000000e+00,
          1.50000000e+00,   2.00000000e+00,   2.50000000e+00,
          3.00000000e+00,   3.50000000e+00],
       [  7.77156117e-16,   7.50000000e-01,   1.50000000e+00,
          2.25000000e+00,   3.00000000e+00,   3.75000000e+00,
          4.50000000e+00,   5.25000000e+00]])

如果你将它四舍五入到小数点后两位,你会看到它与你想要的结果相同:

>>> np.round(c, 2)
array([[ 0.  ,  0.5 ,  1.  ,  1.5 ,  2.  ,  2.5 ,  3.  ,  3.5 ],
       [ 0.  ,  0.75,  1.5 ,  2.25,  3.  ,  3.75,  4.5 ,  5.25]])

在单个语句中:

c = np.stack([np.arange(0, 4, 0.5),
              np.polyval(np.mean(np.stack([np.polyfit(a.T[0], a.T[1], 1),
                                           np.polyfit(b.T[0], b.T[1], 1)]),
                                 axis=0),
                         np.arange(0, 4, 0.5))])

>>> c
array([[  0.00000000e+00,   5.00000000e-01,   1.00000000e+00,
          1.50000000e+00,   2.00000000e+00,   2.50000000e+00,
          3.00000000e+00,   3.50000000e+00],
       [  7.77156117e-16,   7.50000000e-01,   1.50000000e+00,
          2.25000000e+00,   3.00000000e+00,   3.75000000e+00,
          4.50000000e+00,   5.25000000e+00]])

【讨论】:

  • 我认为试图将所有内容都塞进一个声明中会让你失去清晰度。
  • 你是对的:编辑为分别包含每个步骤
  • 哇,谢谢!为您的回答付出了如此多的努力,我很高兴有像您这样的人在那里!不仅您的代码运行良好,而且我认为通过理解它我只是获得了一个更好的程序员:))
猜你喜欢
  • 1970-01-01
  • 2021-10-22
  • 1970-01-01
  • 2014-02-15
  • 2018-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多