1 回答

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ì)成為你所做的任何事情的瓶頸。
添加回答
舉報(bào)