我有一个大型数组,但结构类似于:
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]
[15 16 17 18 19]]
在没有展平数组的情况下,采用5个元素的滚动平均值的最佳,最有效的方法是什么? 即。
值一是(0 + 1 + 2 + 3 + 4)/ 5 = 2
值2将是(1 + 2 + 3 + 4 + 5)/ 5 = 3
值3将是(2 + 3 + 4 + 5 + 6)/ 5 = 4
由于
答案 0 :(得分:1)
执行此操作的“最佳”方法可能是将数组视图提交到uniform_filter
。我不确定这是否会打败你的“无法压扁阵列”,但如果不以某种方式重塑阵列,所有这些方法将比以下方法慢得多:
import numpy as np
import scipy.ndimage.filters as filt
arr=np.array([[0,1,2,3,4],
[5,6,7,8,9],
[10,11,12,13,14],
[15,16,17,18,19]])
avg = filt.uniform_filter(arr.ravel(), size=5)[2:-2]
print avg
[ 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17]
print arr.shape #Original array is not changed.
(4, 5)
答案 1 :(得分:0)
伪代码(虽然它看起来有点像Python):
for i = 0 to 15:
sum = 0
for j from 0 to 4:
// yourLists[m][n] is the nth element of your mth list (zero-indexed)
sum = sum + yourLists [ (i + j) / 5 ] [ (i + j) % 5 ]
next j
print i, sum/5
next i
你最好不要每次都添加所有五个数字。
答案 2 :(得分:0)
注意:此答案不 numpy
具体。
如果列表列表可以展平,这将更简单。
from itertools import tee
def moving_average(list_of_list, window_size):
nums = (n for l in list_of_list for n in l)
it1, it2 = tee(nums)
window_sum = 0
for _ in range(window_size):
window_sum += next(it1)
yield window_sum / window_size
for n in it1:
window_sum += n
window_sum -= next(it2)
yield window_sum / window_size
答案 3 :(得分:0)
“最佳”解决方案将取决于为什么您不希望首先展平阵列的原因。如果数据在内存中是连续的,那么使用步幅技巧是计算滚动平均值而不明确展平数组的有效方法:
In [1]: a = np.arange(20).reshape((4, 5))
In [2]: a
Out[2]:
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]])
In [3]: from numpy.lib.stride_tricks import as_strided
In [4]: s = a.dtype.itemsize
In [5]: aa = as_strided(a, shape=(16,5), strides=(s, s))
In [6]: np.average(aa, axis=1)
Out[6]:
array([ 2., 3., 4., 5., 6., 7., 8., 9., 10., 11., 12.,
13., 14., 15., 16., 17.])