首页 > 解决方案 > numpy数组中的条件均值?

问题描述

我有一个名为“距离”的 numpy 数组,如下所示:

[[ 5.  1.  1.  1.  2.  1.  3.  1.  1.  1.]
[ 5.  4.  4.  5.  7. 10.  3.  2.  1.  1.]
 [ 3.  1.  1.  1.  2.  2.  3.  1.  1.  0.]
 [ 6.  8.  8.  1.  3.  4.  3.  7.  1.  1.]
 [ 4.  1.  1.  3.  2.  1.  3.  1.  1.  1.]
 [ 8. 10. 10.  8.  7. 10.  9.  7.  1.  1.]
 [ 1.  1.  1.  1.  2. 10.  3.  1.  1.  0.]
 [ 2.  1.  2.  1.  2.  1.  3.  1.  1.  0.]
 [ 2.  1.  1.  1.  2.  1.  1.  1.  5.  2.]
 [ 4.  2.  1.  1.  2.  1.  2.  1.  1.  1.]]

我想通过这样的平均值制作一个新的 3*9 numpy 数组:

  1. 如果最后一列为 0,则定义一个数组 c0 (1*9),它是所有此类行的平均值,其中最后一列为 0,其中每列是此类行的列的平均值。
  2. 如果最后一列为 1,则定义一个数组 c1 (1*9),它是所有此类行的平均值,其中最后一列为 1,其中每列是此类行的列的平均值。
  3. 如果最后一列为 2,则定义一个数组 c2 (1*9),它是所有此类行的平均值,其中最后一列为 2,其中每列是此类行的列的平均值。

发布此操作后,我正在执行 hstack 以获得最终的 3*9 数组。我确信这是一个长期的方法,但仍然是错误的。

代码:

c0=distances.mean(axis=1)

final = np.hstack((c0,c1,c2))

这样做我得到 1*10 数组,其中每一列是距离数组中每一列的平均值,但是我无法找到一种方法来做到这一点,即仅当最后一列行仅为 0 时才取平均值?

标签: numpy

解决方案


pandas

会直截了当pandas-

import pandas as pd

df = pd.DataFrame(distances)
df_out = df.groupby(df.shape[1]-1).mean()
df_out['ID'] = df_out.index
out = df_out.values

NumPy

使用自定义函数

对于特定于 NumPy 的,我们可以使用groupbycol(执行基于组的求和)并因此解决我们的案例,如下所示 -

sums  = groupbycol(distances, assume_sorted_col=False, colID=-1)
out = sums/np.bincount(distances[:,-1]).astype(float)[:,None]

matrix-multiplication

mask = distances[:,-1,None] == np.arange(distances[:,-1].max()+1)
out = mask.T.dot(distances)/mask.sum(0)[:,None].astype(float)

推荐阅读