为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕神8447489 2022-07-05 19:20:27
为了说明,成像我有以下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 中做到这一点?我真的需要效率,因为此操作将在嵌套循环中应用。
查看完整描述

3 回答

?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

您可以sum很容易地列:


a_summed = np.sum(a[:,1:3], axis=1)

您还可以取多行的平均值:


a_mean = np.mean(a[1:3], axis=0)

您所要做的就是替换并删除剩余的列,因此它变为:


import numpy as np


a_summed = np.sum(a[:,1:3], axis=1)

a[:, 1] = a_summed

a = np.delete(a, 2, 1)

a_mean = np.mean(a[1:3], axis=0)

a[1] = a_mean

a = np.delete(a, 2, 0)

print(a)


查看完整回答
反对 回复 2022-07-05
?
噜噜哒

TA贡献1784条经验 获得超7个赞

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


查看完整回答
反对 回复 2022-07-05
?
蛊毒传说

TA贡献1895条经验 获得超3个赞

由于您正在更改原始矩阵大小,因此最好分两步完成,如前面的答案中所述,但是,如果您想在一个命令中执行此操作,您可以按如下方式执行,它可以提供一个很好的通用解决方案:


import numpy as np


x = 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 command

print(avgRows_summedColumns(sum_columns(x, 1, 2), 1, 2))

这样,您的矩阵有多大并不重要。


查看完整回答
反对 回复 2022-07-05
  • 3 回答
  • 0 关注
  • 92 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信