Numpy - 对2D数组的多列求平均值

5

现在我正在使用迭代的方式进行操作,但是必须有一种使用numpy函数完成此任务的方法。我的目标是每次平均J列,从而产生一个新的数组,该数组与原始数组具有相同的行数,但具有列数/J列。

所以我想要做到这一点:

J = 2 // two columns averaged at a time

[[1 2 3 4]
 [4 3 7 1]
 [6 2 3 4]
 [3 4 4 1]]

并生成如下内容:
[[1.5 3.5]
 [3.5 4.0]
 [4.0 3.5]
 [3.5 2.5]]

有没有简单的方法来完成这个任务?我还需要一种方法,即使我最终没有未平均的余数列也可以使用。例如,如果我有一个带有5列和J = 2的输入数组,则会对前两列进行平均,然后对后三列进行平均。
如果您能提供任何帮助将不胜感激。
2个回答

4
data.reshape(-1,j).mean(axis=1).reshape(data.shape[0],-1)

如果您的j可以整除data.shape[1],那么请进行以下操作。
示例:
In [40]: data
Out[40]: 
array([[7, 9, 7, 2],
       [7, 6, 1, 5],
       [8, 1, 0, 7],
       [8, 3, 3, 2]])

In [41]: data.reshape(-1,j).mean(axis=1).reshape(data.shape[0],-1)
Out[41]: 
array([[ 8. ,  4.5],
       [ 6.5,  3. ],
       [ 4.5,  3.5],
       [ 5.5,  2.5]])

2
首先,看起来你根本没有对列进行平均,你只是每次平均两个数据点。我认为你最好使用reshape数组,这样你就可以得到一个Nx2的数据结构,直接输入给mean函数。如果列数不兼容,你可能需要先进行填充。然后,在最后将填充的剩余列和前一列加权平均。最后将其重新reshape为所需形状。
接下来是TheodrosZelleke提供的示例。
In [1]: data = np.concatenate((data, np.array([[5, 6, 7, 8]]).T), 1)

In [2]: data
Out[2]: 
array([[7, 9, 7, 2, 5],
       [7, 6, 1, 5, 6],
       [8, 1, 0, 7, 7],
       [8, 3, 3, 2, 8]])

In [3]: cols = data.shape[1]

In [4]: j = 2

In [5]: dataPadded = np.concatenate((data, np.zeros((data.shape[0], j - cols % j))), 1)

In [6]: dataPadded
Out[6]: 
array([[ 7.,  9.,  7.,  2.,  5.,  0.],
       [ 7.,  6.,  1.,  5.,  6.,  0.],
       [ 8.,  1.,  0.,  7.,  7.,  0.],
       [ 8.,  3.,  3.,  2.,  8.,  0.]])

In [7]: dataAvg = dataPadded.reshape((-1,j)).mean(axis=1).reshape((data.shape[0], -1))

In [8]: dataAvg
Out[8]: 
array([[ 8. ,  4.5,  2.5],
       [ 6.5,  3. ,  3. ],
       [ 4.5,  3.5,  3.5],
       [ 5.5,  2.5,  4. ]])

In [9]: if cols % j:
    dataAvg[:, -2] = (dataAvg[:, -2] * j + dataAvg[:, -1] * (cols % j)) / (j + cols % j)
    dataAvg = dataAvg[:, :-1]
   ....:     

In [10]: dataAvg
Out[10]: 
array([[ 8.        ,  3.83333333],
       [ 6.5       ,  3.        ],
       [ 4.5       ,  3.5       ],
       [ 5.5       ,  3.        ]])

能否详细说明一下第9行语句的实现目标?那部分让我有点困惑。 - user1764386
是的,那就是加权平均部分。由于您在上面指定了要将余数列附加到最后一列,因此如果有余数(如果有,则cols%j不为零,请查找模运算符,如果您不熟悉),则最后一行会折叠余数。但您不能只做一个简单的平均值,因为倒数第二列组有j列,而余数组少于j列。这样清楚吗? - acjay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接