使用numpy平均相邻值以减小数组大小

olqngx59  于 2023-02-04  发布在  其他
关注(0)|答案(4)|浏览(101)

我在numpy中有一个包含数千个值的大型数组,我想通过求相邻值的平均值来减小它的大小。例如:

a = [2,3,4,8,9,10]
#average down to 2 values here
a = [3,9]
#it averaged 2,3,4 and 8,9,10 together

基本上,数组中有n个元素,我想让它取X个值的平均值,它就像上面一样取平均值。
有没有什么方法可以用numpy(已经用它做其他事情了,所以我想坚持用它)。

im9ewurl

im9ewurl1#

使用reshapemean,可以对大小为N*m的一维数组的每个m相邻值求平均值,其中N为任意正整数。例如:

import numpy as np

m = 3
a = np.array([2, 3, 4, 8, 9, 10])
b = a.reshape(-1, m).mean(axis=1)
#array([3., 9.])

1)a.reshape(-1, m)将在不复制数据的情况下创建阵列的2D图像:

array([[ 2,  3,  4],
       [ 8,  9, 10]])

2)取第二个轴(axis=1)的平均值,然后计算每行的平均值,得到:

array([3., 9.])
zujrkrfu

zujrkrfu2#

试试这个:

n_averaged_elements = 3
averaged_array = []
a = np.array([ 2,  3,  4,  8,  9, 10])
for i in range(0, len(a), n_averaged_elements):
   slice_from_index = i
   slice_to_index = slice_from_index + n_averaged_elements
   averaged_array.append(np.mean(a[slice_from_index:slice_to_index]))

>>>> averaged_array
>>>> [3.0, 9.0]
eoxn13cs

eoxn13cs3#

看起来像是一个简单的非重叠移动窗口平均值,那么:

In [3]:

import numpy as np
a = np.array([2,3,4,8,9,10])
window_sz = 3
a[:len(a)/window_sz*window_sz].reshape(-1,window_sz).mean(1) 
#you want to be sure your array can be reshaped properly, so the [:len(a)/window_sz*window_sz] part
Out[3]:
array([ 3.,  9.])
pjngdqdw

pjngdqdw4#

在这个例子中,我假设a是需要求平均值的一维numpy数组,在下面给出的方法中,我们首先找到这个数组a的长度因子,然后选择一个合适的因子作为求平均值的步长。
下面是代码。

import numpy as np
from functools import reduce

''' Function to find factors of a given number 'n' '''
def factors(n):    
    return list(set(reduce(list.__add__, 
        ([i, n//i] for i in range(1, int(n**0.5) + 1) if n % i == 0))))

a = [2,3,4,8,9,10]  #Given array.

'''fac: list of factors of length of a. 
   In this example, len(a) = 6. So, fac = [1, 2, 3, 6] '''
fac = factors(len(a)) 

'''step: choose an appropriate step size from the list 'fac'.
   In this example, we choose one of the middle numbers in fac 
   (3). '''   
step = fac[int( len(fac)/3 )+1]

'''avg: initialize an empty array. '''
avg = np.array([])
for i in range(0, len(a), step):
    avg = np.append( avg, np.mean(a[i:i+step]) ) #append averaged values to `avg`

print avg  #Prints the final result

[3.0, 9.0]

相关问题