基于第二列间隔的列值的平均值
Average of column values based on intervals of a second column
我有一个包含两列的数据集,第 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
):
Operands could not be broadcast together with shapes (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)])
这里是一个矢量化的方法利用 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 通过重复给定次数来构造一个数组,在这种情况下,我们将有 t
和 P
的 len(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])
我有一个包含两列的数据集,第 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
):
Operands could not be broadcast together with shapes (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)])
这里是一个矢量化的方法利用 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 通过重复给定次数来构造一个数组,在这种情况下,我们将有 t
和 P
的 len(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])