【问题标题】:Apply 2 array function to array in numpy将2个数组函数应用于numpy中的数组
【发布时间】:2020-02-24 19:18:29
【问题描述】:

所以我有一个函数,它接受 2 个数组并返回 2 个浮点数。但是现在我需要将它应用于初始的每个 2xN 子数组。这就是我现在所拥有的。

import numpy as np

def least_square(x, y=None):
    print(x, y)
    if y is None:
        x, y = x
    k = (np.mean(x*y)-np.mean(x)*np.mean(y))/np.var(x)
    b = np.mean(y)-np.mean(x)*k
    return k, b

n1, t1, r1 = np.array([5, 5, 10, 10, 20, 20]), np.array([6.53, 6.56, 13.44, 13.53, 27.38, 27.72]), 6.5
n2, t2, r2 = np.array([5, 5, 10, 10, 20, 20]), np.array([7.53, 7.62, 15.41, 15.57, 30.62, 30.87]), 4.9
n3, t3, r3 = np.array([5, 5, 10, 10, 20, 20]), np.array([8.53, 8.75, 17.50, 17.62, 36.18, 36.07]), 3.9
n4, t4, r4 = np.array([5, 5, 10, 10, 8, 8]), np.array([10.8, 11.07, 19.47, 19.38, 16.03, 15.69]), 2.5
n5, t5, r5 = np.array([5, 5, 10, 10, 8, 8]), np.array([11.91, 11.65, 21.97, 22.50, 19.25, 19.53]), 2.2

n_s = np.array([n1, n2, n3, n4, n5])
t_s = np.array([t1, t2, t3, t4, t5])

T_ls = [least_square(x, y) for x, y in np.stack((n_s, t_s), axis=-2)]

想应用到这个数组,所以函数会得到成对的 6 长度数组。

 print(np.stack((n_s, t_s), axis=-2))
    [[[ 5.    5.   10.   10.   20.   20.  ]
      [ 6.53  6.56 13.44 13.53 27.38 27.72]]

     [[ 5.    5.   10.   10.   20.   20.  ]
      [ 7.53  7.62 15.41 15.57 30.62 30.87]]

     [[ 5.    5.   10.   10.   20.   20.  ]
      [ 8.53  8.75 17.5  17.62 36.18 36.07]]

     [[ 5.    5.   10.   10.    8.    8.  ]
      [10.8  11.07 19.47 19.38 16.03 15.69]]

     [[ 5.    5.   10.   10.    8.    8.  ]
      [11.91 11.65 21.97 22.5  19.25 19.53]]]

返回

T_ls
[(1.401214285714286, -0.48750000000000426),
 (1.5419285714285704, -0.05249999999998778),
 (1.8357857142857141, -0.6424999999999947),
 (1.693552631578944, 2.422763157894762),
 (2.1261842105263162, 1.5009210526315755)]

但我几乎可以肯定,在 numpy 中有更好的方法。

【问题讨论】:

    标签: python function numpy multidimensional-array


    【解决方案1】:

    我不确定您所说的“更好的方法”是什么意思,但我更喜欢矩阵乘法来找到最小二乘。

    def least_square_v2(x, y=None):
        if y is None:
            x, y = x
        X = np.c_[np.ones(x.shape[0]), x]
        k = np.dot(np.linalg.inv(np.dot(X.T, X)), X.T)
        b = np.dot(k, y)
        return b
    

    矩阵乘法也稍微快一点。

    op的函数timeit

    355 µs ± 30.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
    

    v2 时间

    276 µs ± 16 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-25
      • 1970-01-01
      • 2014-04-20
      • 1970-01-01
      • 1970-01-01
      • 2017-08-20
      • 1970-01-01
      相关资源
      最近更新 更多