亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何求和/平均列或行的特定子集并在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 關注
  • 113 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號