numpy数组中的条件平均数?

numpy数组中的条件平均数?,numpy,Numpy,我有一个名为distances的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.

我有一个名为distances的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.]]
c0= (distances[distances[:,-1] == 0][:,0:9]).mean(axis=0)
c1 = (distances[distances[:,-1] == 1][:,0:9]).mean(axis=0)
c2 = (distances[distances[:,-1] == 2][:,0:9]).mean(axis=0)
我想通过这样取平均值来制作一个新的3*9 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.]]
c0= (distances[distances[:,-1] == 0][:,0:9]).mean(axis=0)
c1 = (distances[distances[:,-1] == 1][:,0:9]).mean(axis=0)
c2 = (distances[distances[:,-1] == 2][:,0:9]).mean(axis=0)
如果最后一列为0,则定义一个数组c0 1*9,该数组是所有此类行的平均值,其中最后一列为0,其中每列是此类行中的列的平均值。 如果最后一列为1,则定义一个数组c1 1*9,该数组是所有此类行的平均值,其中最后一列为1,其中每列是此类行中的列的平均值。 若最后一列为2,则定义一个数组c2 1*9,该数组是所有此类行的平均值,其中最后一列为2,其中每列是此类行中的列的平均值。 完成此操作后,我正在进行hstack以获得最终的3*9阵列。我相信这是一个长期的方法,但仍然是错误的

代码:

这样我得到了1*10数组,其中每列都是距离数组中每列的平均值,但是我找不到这样做的方法,条件是当最后一行仅为0时才取平均值?

和熊猫在一起会很直接-

与努比 使用自定义函数

对于NumPy特定的一个,我们可以使用并因此解决我们的案例,就像这样-

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


我可以这样做:

[[ 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.]]
c0= (distances[distances[:,-1] == 0][:,0:9]).mean(axis=0)
c1 = (distances[distances[:,-1] == 1][:,0:9]).mean(axis=0)
c2 = (distances[distances[:,-1] == 2][:,0:9]).mean(axis=0)

使用这种方法不需要输出。例如:c0=[2,1,1.33,1,2……]即对于最后一列为0的所有行,求出这些行中所有列的平均值,并生成一个新数组,使每列作为这些行的平均值。@R_Moose因此,您的代码必须是:np.平均距离[距离[:,-1]==0][:,0],轴=0等等?是的,所以这基本上是np.平均距离[距离[:,-1]==0][:,0],给出最后一列为0的所有行中第0列的平均值。我得到一个值。在我的例子中,我需要运行这9次来获得9个这样的值,然后通过垂直叠加它们来生成一个数组。我在寻找一种更简单的方法。@R\u Moose请编辑问题并将正确的代码放在那里。通过我的问题,我试图传达我已经尝试过的内容,如果有更简单的方法可以同时对所有9列执行相同的操作。