如何求和/平均列或行的特定子集并在numpy中返回新的ndarray?

为了说明,成像我有以下ndarray:


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]]

我想对第 1 列和第 2 列的两个向量求和(从 0 开始计数),这样新的 ndarray 将是:


y = [[0.5,  0.4,  0.1],

     [0.4,  0.4,  0.2],

     [0.4,  0.5,  0.1],

     [0.6,  0.2,  0.2]]

然后,我想对第 1 行和第 2 行的向量进行平均,以便最终结果为:


z = [[0.5,  0.4,   0.1 ],

     [0.4,  0.45,  0.15],

     [0.6,  0.2,   0.2 ]]

有没有一种有效的方法可以在一个命令中在 numpy 中做到这一点?我真的需要效率,因为此操作将在嵌套循环中应用。


慕神8447489
浏览 125回答 3
3回答

小怪兽爱吃肉

您可以sum很容易地列:a_summed = np.sum(a[:,1:3], axis=1)您还可以取多行的平均值:a_mean = np.mean(a[1:3], axis=0)您所要做的就是替换并删除剩余的列,因此它变为:import numpy as npa_summed = np.sum(a[:,1:3], axis=1)a[:, 1] = a_summeda = np.delete(a, 2, 1)a_mean = np.mean(a[1:3], axis=0)a[1] = a_meana = np.delete(a, 2, 0)print(a)

噜噜哒

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))这样,您的矩阵有多大并不重要。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python