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