【问题标题】:Average of column values based on intervals of a second column基于第二列间隔的列值平均值
【发布时间】:2020-03-31 04:05:41
【问题描述】:

我有一个包含两列的数据集,第 1 列是从 1 秒到 9 秒的时间,第 2 列是特定秒内事件的概率,其值为 30、69、56、70、90, 59、87、10、20。

我试图获得一个时间间隔内的平均概率(在这种情况下为 2 秒后),例如 2 到 3 秒、2 到 4 秒、2 到 5 秒、....2 到 9 之间的概率秒。

我尝试了以下方法,其中定义了一个函数t_inc,其增量为 1 大于 2。但是,我收到以下错误消息(代码中的P_slice_avg_1):

操作数不能与形状 (9,) (7,) 一起广播

因为我的 t_inc 的形状是 7。

当我尝试以手动方式(代码中的P_slice_avg_2)执行此操作时,它可以工作,但如果我想在大量时间间隔内执行此操作,则不可行。

任何关于如何概括它的帮助都会非常有帮助。

import numpy as np
data=np.loadtxt('C:/Users/Hrihaan/Desktop/Sample.txt')

t=data[:,0] # t goes from 1 to 9
P=data[:,1] # probability of an event in a specific second

i= np.arange(1, 8 , 1)
t_inc= 2 + i 

P_slice_avg_1= np.mean(P[(t>=2) & (t<=t_inc)]) # I thought this would give me the averages between 2 and values of t_inc

P_slice_avg_2= np.mean(P[(t>=2) & (t<=3)]), np.mean(P[(t>=2) & (t<=4)]), np.mean(P[(t>=2) & (t<=5)]), np.mean(P[(t>=2) & (t<=6)]), np.mean(P[(t>=2) & (t<=7)]), np.mean(P[(t>=2) & (t<=8)]), np.mean(P[(t>=2) & (t<=9)])

【问题讨论】:

    标签: python numpy average multiple-columns


    【解决方案1】:

    这里是利用numpy broadcasting的矢量化方法:

    import numpy as np
    t = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9]) 
    P = np.array([30, 69, 56, 70, 90, 59, 87, 10, 20], dtype=float) 
    i = np.arange(1, 8 , 1)
    t_inc= 2 + i 
    
    T = np.tile(t[:,None], len(i))
    P = np.tile(P[:,None], len(i))
    

    np.tile 通过重复给定次数来构造一个数组,在这种情况下,我们将拥有tPlen(i) 副本,即:

    P
    array([[30., 30., 30., 30., 30., 30., 30.],
           [69., 69., 69., 69., 69., 69., 69.],
           [56., 56., 56., 56., 56., 56., 56.],
           [70., 70., 70., 70., 70., 70., 70.],
           [90., 90., 90., 90., 90., 90., 90.],
           [59., 59., 59., 59., 59., 59., 59.],
           [87., 87., 87., 87., 87., 87., 87.],
           [10., 10., 10., 10., 10., 10., 10.],
           [20., 20., 20., 20., 20., 20., 20.]])
    

    现在我们使用np.logical_or 将所有不满足所需条件的元素设置为零:

    P[np.logical_or(2>T, T>t_inc)]=0
    P
    array([[ 0.,  0.,  0.,  0.,  0.,  0.,  0.],
           [69., 69., 69., 69., 69., 69., 69.],
           [56., 56., 56., 56., 56., 56., 56.],
           [ 0., 70., 70., 70., 70., 70., 70.],
           [ 0.,  0., 90., 90., 90., 90., 90.],
           [ 0.,  0.,  0., 59., 59., 59., 59.],
           [ 0.,  0.,  0.,  0., 87., 87., 87.],
           [ 0.,  0.,  0.,  0.,  0., 10., 10.],
           [ 0.,  0.,  0.,  0.,  0.,  0., 20.]])
    

    通过这种方式,我们在每一列中准确地存储了要平均的元素,但是使用np.mean 会产生错误的结果,因为分母是P.shape[0],即还要计算零元素。作为一种解决方法,我们可以沿轴求和,然后使用np.count_nonzero 除以非零元素的总数:

    np.sum(P, axis=0)/np.count_nonzero(P, axis=0)
    array([62.5, 65., 71.25, 68.8, 71.83333333, 63., 57.625])
    

    【讨论】:

    • 非常感谢,但我没有得到想要的结果。我正在寻找基于 t 间隔的 P 均值。此外,平均切片的 len 会发生变化,对于 t>=2 和 t=2 和 t
    • 对于这个特定问题,我想要的输出是这个 (62.5, 65.0, 71.25, 68.8, 71.83333333333333, 63.0, 57.625)
    • @Hrihaan 忘了把 T 改成 P,我编辑了我的答案,请现在检查一下。
    • 我将条件更改为 (T>=2, T
    • 我将 T 中低于 2 或高于 T 的元素设为零。设置此条件 (T>=2, T
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多