【问题标题】:Efficient way to do math operation between Numpy rows在 Numpy 行之间进行数学运算的有效方法
【发布时间】:2021-09-09 15:06:51
【问题描述】:

这个想法是在Numpy array中的行之间进行减法。

这里提出了列表理解。但是,我想知道是否有更高效和快速的。

目前,当给定一个大的arr 时,建议的解决方案很慢

import numpy as np
nfreq=500
arr=np.array([[11850,0,1],
[12310,0,3],
[13924,0,4],
[16690,0,1],
[17082,0,3],
[18746,0,4],
[21956,0,2],
[22324,0,3],
[23694,0,4],
[25382,0,1],
[25776,0,3],
[28592,0,4],
[31676,0,2],
[32028,0,3],
[33498,0,4]])
trange = np.where(arr == 3)[0]
val=[(arr[x,0],(arr[x,0]-arr[x-1,0])/nfreq,(arr[x+1,0]-arr[x,0])/nfreq) for x in trange]
val=np.array(val)

【问题讨论】:

    标签: python performance numpy


    【解决方案1】:

    您可以尝试向量等效,但是由于有 3 个单独的操作,将它们合并到最终数组中仍然存在瓶颈。效率取决于行数。

    np.array([arr[trange, 0],
              (arr[trange, 0]-arr[trange-1, 0])/nfreq,
              (arr[trange+1, 0]-arr[trange, 0])/nfreq]).T
    

    输出:

    array([[1.2310e+04, 9.2000e-01, 3.2280e+00],
           [1.7082e+04, 7.8400e-01, 3.3280e+00],
           [2.2324e+04, 7.3600e-01, 2.7400e+00],
           [2.5776e+04, 7.8800e-01, 5.6320e+00],
           [3.2028e+04, 7.0400e-01, 2.9400e+00]])
    

    【讨论】:

    • 这个活动更好
    • 请注意,将arr[trange, 0] 存储在临时变量中应该会快一些,因为 Numpy 不会重新计算 3 次。
    • @Jérôme 确实如此,但不要指望会有惊人的变化,这里的切片时间约为 1µs,因此仅对 3 个变量不明显;)
    【解决方案2】:

    你可以试试

    a = arr[trange, 0]
    b = (arr[trange, 0] - arr[trange-1, 0])/nfreq
    c = (arr[trange+1, 0] - arr[trange, 0])/nfreq
    
    output = np.stack((a,b,c), axis=1)
    
    # array([[1.2310e+04, 9.2000e-01, 3.2280e+00],
    #        [1.7082e+04, 7.8400e-01, 3.3280e+00],
    #        [2.2324e+04, 7.3600e-01, 2.7400e+00],
    #        [2.5776e+04, 7.8800e-01, 5.6320e+00],
    #        [3.2028e+04, 7.0400e-01, 2.9400e+00]])
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-28
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多