Python 如何将1D numpy数组拆分为块,每个块的长度取决于条件

Python 如何将1D numpy数组拆分为块,每个块的长度取决于条件,python,arrays,chunks,Python,Arrays,Chunks,我对python和编程都是新手,所以请给我一些启发 我有两个1D数组用于数据,时间。时间上的每个元素对应数据中的一个元素。时间元素对应于一整天的测量 我想把数据数组分成288个块,每个块对应一个5分钟的时间数组块,然后取每个数据块的平均值 时间数组包含从过去某个特定点开始计数的以秒为单位的元素。N+1和N元素的差值等于两个数据样本之间的时间差 我的目标是每300秒分割一次时间数组,然后在数据数组中找到相应的元素。 两个数据元素之间的采样率并不总是相同的,有时每11.3秒采样一次,有时每22.6秒

我对python和编程都是新手,所以请给我一些启发

我有两个1D数组用于数据,时间。时间上的每个元素对应数据中的一个元素。时间元素对应于一整天的测量

我想把数据数组分成288个块,每个块对应一个5分钟的时间数组块,然后取每个数据块的平均值

时间数组包含从过去某个特定点开始计数的以秒为单位的元素。N+1和N元素的差值等于两个数据样本之间的时间差

我的目标是每300秒分割一次时间数组,然后在数据数组中找到相应的元素。 两个数据元素之间的采样率并不总是相同的,有时每11.3秒采样一次,有时每22.6秒采样一次,因此不可能使用np.split立即拆分阵列

这是我的代码:

matrix = np.zeros((288,1), dtype=float)
mean_timestamps = np.zeros((288,1), dtype=float)
w=0
for i in range(288):
    meanchunk = np.empty((20,1))
    meanchunk[:] = np.nan
    a = w 
    while time[w] - time[a] < 300:     #time difference in seconds
        if w == 4175:
            break
        meanchunk[w-a] = data[w]
        if np.logical_not(np.isnan(data[w])):
            mean_timestamps[i] = time[w]
        else:
            mean_timestamps[i] = np.nan

        matrix[i] = np.nanmean(meanchunk)

    if time[w+1] - time[a] > 300: 
        w = w+1
        break
    else:
        w = w+1
mean_timestamps = mean_timestamps[mean_timestamps !=0]
matrix = matrix[matrix !=0]
编辑:

这更接近:从数组的第一个值开始查找每300秒块的结束时间,然后使用布尔索引提取块并获得平均值。仍然使用常规python进行循环

span = a[-1] - a[0]
nbr_of_intervals = int((span//300) + 1)
ends = (np.zeros(nbr_of_intervals)+300).cumsum() + a[0]
averages = []
begin = a[0]
for end in ends:
    chunk = a[(begin <= a) & (a < end)]
    averages.append(chunk.mean())
    begin = end
编辑:

这更接近:从数组的第一个值开始查找每300秒块的结束时间,然后使用布尔索引提取块并获得平均值。仍然使用常规python进行循环

span = a[-1] - a[0]
nbr_of_intervals = int((span//300) + 1)
ends = (np.zeros(nbr_of_intervals)+300).cumsum() + a[0]
averages = []
begin = a[0]
for end in ends:
    chunk = a[(begin <= a) & (a < end)]
    averages.append(chunk.mean())
    begin = end

请不要发布代码、数据或回溯的图像。复制并粘贴为文本,然后将其格式化为代码(选择它并键入
ctrl-k
)。。。您应该包括一个最小的数据示例,足以让我们测试您或我们的解决方案。-看起来这可能是
时间
数组。它们只是浮点数吗?如果不是,数据类型是什么?@wwii是的,它们只是浮动的、转换的datetime对象。如果末尾有一个不跨越300秒的块,该怎么办?请不要发布代码、数据或回溯的图像。复制并粘贴为文本,然后将其格式化为代码(选择它并键入
ctrl-k
)。。。您应该包括一个最小的数据示例,足以让我们测试您或我们的解决方案。-看起来这可能是
时间
数组。它们只是浮点数吗?如果不是,那么数据类型是什么?@wwii是的,它们只是浮点数,转换的datetime对象。如果末尾有一个不跨越300秒的数据块呢。您以前的答案在应用于整个时间数组时返回了273个数据块,而这一个返回了288个时间间隔。我99.9%确定这就是我想要的,如果不是,我会再回复另一条评论。多亏了L-O-TY,我们之前的答案在应用于整个时间数组时返回了273个块,而这一个返回了288个间隔。我99.9%确定这就是我想要的,如果不是,我会再回复另一条评论。谢谢你,L-O-T
q = a[:,None] >= ends    # shape (485,34) using the array values from the question.
r = q.argmax(axis=0)
r = r[r.nonzero()]       # shape (33,) - indices to split on
chunks = np.split(a,r)
avgs = [ary.mean() for ary in chunks]