【问题标题】:Python 3, Numpy: Split data into blocks of fixed length and calculate statistics for each blockPython 3,Numpy:将数据拆分为固定长度的块并计算每个块的统计信息
【发布时间】:2021-09-23 10:03:12
【问题描述】:

快速解决方案

如果您只想将一个 numpy 数组或 python 列表拆分为固定长度的数组或列表,请执行以下操作:

l = 10 # the fixed length of output array
output = [input[l*i:l*(i+1)-1] for i in range(0, len(input) // l)]

如果输入不是可被l 整除的整数,但您想在输出中包含最终(较短的)数组,请执行以下操作:

l = 10 # the fixed length of output array
output = [input[l*i:l*(i+1)-1] for i in range(0, (len(input) + l - 1) // l)]

完整问题

我正在尝试计算一些数据的一些统计数据。示例统计数据包括平均值、标准差、最小值和最大值。

数据被格式化为 python numpy 数组。这是一个简单的例子:

data_in = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
data_array = numpy.array(data_in)

此处示例的数组长度为 10,但在实践中,考虑输入数据的长度为 100 万个元素(但不是精确的整数),并且输出应该对大约 10k 个元素的块进行统计。

这是我尝试过的方法。下面的示例仅显示平均统计量。

mean_out = [numpy.mean(data_array[2*i:2*i+1]) for i in range(0, len(data_array) // 2)]

这似乎不是一个特别优雅的解决方案。这里的“块长度”是2,在上面的表达式中出现在3个地方。

这可以使用bl作为块长度以更通用的方式编写。

mean_out = [numpy.mean(data_array[bl*i:bl*(i+1)-1]) for i in range(0, len(data_array) // bl)]

除此之外,当输入数据长度不能被块长度整除时,上述方法不起作用。例如,将块长度更改为 3 会导致输出长度为 3。

由于3 * 3 = 9,计算中缺少最后一个元素。

这可以通过使用以下表达式“修复”:

mean_out = [numpy.mean(data_array[bl*i:bl*(i+1)-1]) for i in range(0, (len(data_array) + bl - 1) // bl)]

但同样,这并不是特别优雅。

是否有内置的 python 或 numpy 函数通过将输入数组拆分为固定长度的块来计算这些统计信息?或者有没有更好的方法来做这个我不知道的计算?

【问题讨论】:

    标签: python numpy statistics data-processing


    【解决方案1】:

    Numpy 有 array_split 将数组拆分为块。要计算每个块的mean,您可以使用map

    data_arrays = np.array_split(data_array, len(data_array) // 2)
    print(data_arrays) # [array([1, 2]), array([3, 4]), array([5, 6]), array([7, 8]), array([ 9, 10])]
    print(list(map(np.mean, data_arrays))) # [1.5, 3.5, 5.5, 7.5, 9.5]
    
    data_arrays = np.array_split(data_array, len(data_array) // 3)
    print(data_arrays) # [array([1, 2, 3, 4]), array([5, 6, 7]), array([ 8,  9, 10])]
    print(list(map(np.mean, data_arrays))) # [2.5, 6.0, 9.0]
    

    注意:要在 iter 对象中映射返回,要转换为相同格式的输出(numpy 数组),需要以下内容:

    numpy.fromiter(map(numpy.mean, data_array), dtype=numpy.float)
    

    同样的事情可以通过转换为列表,然后转换为numpy数组来完成,如上所示。

    【讨论】:

    • 非常好 - 批准
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-29
    • 2020-09-19
    • 2020-08-27
    • 1970-01-01
    • 2019-12-26
    相关资源
    最近更新 更多