噜噜哒
In [68]: x = [[0.5, 0.3, 0.1, 0.1], ...: [0.4, 0.1, 0.3, 0.2], ...: [0.4, 0.3, 0.2, 0.1], ...: [0.6, 0.1, 0.1, 0.2]] In [69]: x=np.array(x)ufunc比如np.add有一种reduceat方法可以让我们对多组行或列执行操作。有了第一个减少很容易(但需要一点时间来理解参数):In [70]: np.add.reduceat(x,[0,1,3], axis=1) Out[70]: array([[0.5, 0.4, 0.1], [0.4, 0.4, 0.2], [0.4, 0.5, 0.1], [0.6, 0.2, 0.2]])显然mean不是 a ufunc,所以我不得不满足add于减少行数:In [71]: np.add.reduceat(Out[70],[0,1,3],axis=0) Out[71]: array([[0.5, 0.4, 0.1], [0.8, 0.9, 0.3], [0.6, 0.2, 0.2]])然后除以行数得到平均值。我可以将其概括为使用 中使用的相同[0,1,3],reduceat但现在只使用列数组:In [72]: np.add.reduceat(Out[70],[0,1,3],axis=0)/np.array([1,2,1])[:,None] Out[72]: array([[0.5 , 0.4 , 0.1 ], [0.4 , 0.45, 0.15], [0.6 , 0.2 , 0.2 ]])整个事情都在一个表达式中:In [73]: np.add.reduceat(np.add.reduceat(x,[0,1,3], axis=1),[0,1,3],axis=0)/ np.array([1,2,1])[:,None] Out[73]: array([[0.5 , 0.4 , 0.1 ], [0.4 , 0.45, 0.15], [0.6 , 0.2 , 0.2 ]])
蛊毒传说
由于您正在更改原始矩阵大小,因此最好分两步完成,如前面的答案中所述,但是,如果您想在一个命令中执行此操作,您可以按如下方式执行,它可以提供一个很好的通用解决方案:import numpy as npx = np.array(([0.5, 0.3, 0.1, 0.1, 1], [0.4, 0.1, 0.3, 0.2, 1], [0.4, 0.3, 0.2, 0.1, 1], [0.6, 0.1, 0.1, 0.2, 1]))def sum_columns(matrix, col_start, col_end): return np.column_stack((matrix[:, 0:col_start], np.sum(matrix[:, col_start:col_end + 1], axis=1), matrix[:, col_end + 1:]))def avgRows_summedColumns(matrix, row_start, row_end): return np.row_stack((matrix[0:row_start, :], np.mean(matrix[row_start:row_end + 1, :], axis=0), matrix[row_end:-1, :]))# call the entire operation in one commandprint(avgRows_summedColumns(sum_columns(x, 1, 2), 1, 2))这样,您的矩阵有多大并不重要。