numpy数组中的条件平均数?
我有一个名为distances的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.
[[ 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列执行相同的操作。