我有一个像a=[1, 2, 3, 4, 5, 6, 7]
这样的数组。我想将此数组拆分为3个任意大小的块。
当我将其分成3个块时,我得到3个子数组:[array([1, 2, 3]), array([4, 5]), array([6, 7])]
。
我的目标是得到一个数组,该数组中包含子数组中的元素的平均值:[2, 4.5, 6.5]
,因为(1+2+3)/3=2
(第一个元素),(4+5)/2=4.5
(第二个元素),依此类推
我尝试了以下代码:
import numpy as np
a=[1, 2, 3, 4, 5, 6, 7]
a_split=np.array_split(a, 3)
a_split_avg=np.mean(a_split, axis=1)
我遇到以下错误:tuple index out of range
。
答案 0 :(得分:3)
这是一个矢量化的解决方案,它避免了拆分步骤,从而提高了性能,并直接获取了分组的求和值,因此得到了平均值-
def average_groups(a, N): # N is number of groups and a is input array
n = len(a)
m = n//N
w = np.full(N,m)
w[:n-m*N] += 1
sums = np.add.reduceat(a, np.r_[0,w.cumsum()[:-1]])
return np.true_divide(sums,w)
样品运行-
In [357]: a=[1, 2, 3, 4, 5, 6, 7]
In [358]: average_groups(a, N=3)
Out[358]: array([2. , 4.5, 6.5])
答案 1 :(得分:1)
尝试一下:
In [1224]: mean_arr = []
In [1225]: for i in a_split:
...: mean_arr.append(np.mean(i))
In [1226]:
In [1226]: mean_arr
Out[1226]: [2.0, 4.5, 6.5]
答案 2 :(得分:1)
您会收到错误消息,因为np.array_split
返回了一个numpy数组的python列表,而不是多维numpy数组,因此axis
不能使用它。以此替换最后一行:
a_split_avg = [np.mean(arr) for arr in a_split]
答案 3 :(得分:1)
您可以在计算中使用mean
来将means = np.vectorize(np.mean)(a_split)
函数应用于数组列表中的每个项目:
{{1}}
结果是一个列表,其中包含您创建的每个子数组的平均值。