微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python 3、Numpy:将数据拆分为固定长度的块并计算每个块的统计信息

如何解决Python 3、Numpy:将数据拆分为固定长度的块并计算每个块的统计信息

快速解决方

如果您只想将 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 函数通过将输入数组拆分为固定长度的块来计算这些统计数据?或者有没有更好的方法来做这个我不知道的计算?

解决方法

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,6,7]),array([ 8,9,data_arrays))) # [2.5,6.0,9.0]

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。