第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

在 2D numpy 數(shù)組的子矩陣上高效運(yùn)行

在 2D numpy 數(shù)組的子矩陣上高效運(yùn)行

炎炎設(shè)計(jì) 2021-07-27 17:22:07
我無(wú)法有效地執(zhí)行以下矩陣運(yùn)算。從一個(gè)方陣(2D numpy 數(shù)組)和跨越矩陣每個(gè)索引的組(字典:鍵是組,值是組中矩陣索引的列表)開(kāi)始,我需要獲得一個(gè)新的、更小的矩陣包含原始矩陣的每個(gè)子矩陣中元素的總和。子矩陣是根據(jù)組的索引定義的。因此,新矩陣也將是方形的,但以組數(shù)作為其維度。讓我們看看下面的例子:import numpy as npX = np.arange(49).reshape((7, 7))d = {0: [0, 1], 1: [2, 3, 4], 2: [5, 6]}def get_new_matrix(matrix, groups_indexes):    groups_number = len(groups_indexes)    new_matrix = np.zeros((groups_number, groups_number))    for i in range(groups_number):        for j in range(groups_number):            new_matrix[i][j] = np.sum(matrix[groups_indexes[i]][:,groups_indexes[j]])    return new_matrixZ = get_new_matrix(X, d)print(Z)[[ 16  39  36] [129 216 159] [156 249 176]]查看結(jié)果,例如在(第二)第 1 行和(第三)列 2 中,我們注意到結(jié)果是 159,這是:Z[1,2]這意味著在原始矩陣中,由行中的組 1 和列中的組 2 定義的子矩陣,即第 2、3 和 4 行以及第 5 和第 6 列,明確為:X[[2, 3, 4]][:,[5, 6]]并且子矩陣中所有元素的總和為19+20+26+27+33+34=159。明確:np.sum(X[[2, 3, 4]][:,[5, 6]])有沒(méi)有什么辦法可以寫(xiě)出更pythonic的代碼,避免兩次for循環(huán)獲取新矩陣,提高整體效率?我想它應(yīng)該是花哨的索引、廣播等,但我還沒(méi)有找到更好的解決方案。我當(dāng)前的代碼對(duì)于大型初始矩陣(以及潛在的大量初始組)的縮放非常糟糕,而且由于我不僅要為任意的大型初始方陣運(yùn)行它,而且還要在多次迭代中運(yùn)行它,我真的需要改進(jìn)它?;蛘咭苍S沒(méi)有辦法讓代碼變得更好,解釋也會(huì)非常有用:)
查看完整描述

1 回答

?
尚方寶劍之說(shuō)

TA貢獻(xiàn)1788條經(jīng)驗(yàn) 獲得超4個(gè)贊

如果您的組索引跨越整個(gè)矩陣并且是連續(xù)的,您可以將它們存儲(chǔ)為索引而不是字典。由于每組都以下一組的開(kāi)頭結(jié)束,因此您只需要存儲(chǔ)開(kāi)始索引。您的當(dāng)前d可以重寫(xiě)為


d = sorted(val[0] for val in d.values())

或者,如果您不依賴于字典格式,只需


d = np.array([0, 2, 5])

我的建議是應(yīng)用np.add.reduceat兩次,每個(gè)維度一次,基本上就像您在當(dāng)前循環(huán)中所做的那樣,但讓 numpy 在內(nèi)部為您管理循環(huán):


result = np.add.reduceat(np.add.reduceat(X, d, axis=0), d, axis=1)

問(wèn)題中輸入的結(jié)果是:


array([[ 16,  39,  36],

       [129, 216, 159],

       [156, 249, 176]])

159 確實(shí)是索引 [1, 2] 處的元素。


這似乎可以很好地?cái)U(kuò)展。在我不太強(qiáng)大的筆記本電腦上運(yùn)行X = np.arange(10**6).reshape(10**3, 10**3)并d = np.arange(0, 10**3, 10)花費(fèi)大約 2.27 毫秒。我不認(rèn)為這段代碼可能會(huì)成為你所做的任何事情的瓶頸。


查看完整回答
反對(duì) 回復(fù) 2021-08-03
  • 1 回答
  • 0 關(guān)注
  • 99 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)