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, 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数组来完成,如上所示。

最新更新