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

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

將具有形狀 (x,y,z) 和 (x,) 的 numpy 數組相乘和

將具有形狀 (x,y,z) 和 (x,) 的 numpy 數組相乘和

jeck貓 2022-09-20 15:59:46
所以我有一個3D數據集(x,y,z),我想用一組權重對其中一個軸(x)求和,w = w(x)。我正在求和的開始和結束索引對于每個(y,z)都是不同的,我通過屏蔽3D數組解決了這個問題。對于我沒有求和的兩個變量,權重是恒定的。關于實現和數學的答案都是值得贊賞的(有沒有一種聰明的方法?我有一個形狀 (x,y,z) 的 3D 遮罩數組 (A) 和一個形狀 (x,) 的 1D 數組 (t)。有沒有一種好方法可以將A中的每個(y,z)元素與t中的相應數字相乘,而無需將t擴展到3D數組?我目前的解決方案是使用np.tensordot來制作一個與A形狀相同的3D數組,該數組包含所有t值,但是花費運行時構建“new_t”數組感覺非常不令人滿意,該數組實際上只是t的y * z副本。當前解決方案示例:a1 = np.array([[1,2,3,4],               [5,6,7,8],               [9,10,11,12]])a2 = np.array([[0,1,2,3],               [4,5,6,7],               [8,9,10,11]])#note: A is a masked array, mask is a 3D array of boolsA = np.ma.masked_array([a1,a2],mask)t = np.array([10,11])new_t = np.tensordot(t, np.ones(A[0].shape), axes = 0)return np.sum(A*new_t, axis=0)從本質上講,我想以盡可能短的運行時間對所有i,j執行t*A[:,i,j],最好不使用太多其他庫,而不是numpy和scipy。產生所需輸出的另一種方法(同樣,運行時間太長):B = [[t*A[:,i,j] for j in range(A.shape[2])] for i in range(A.shape[1])]return np.sum(B,axis=2)
查看完整描述

2 回答

?
開心每一天1111

TA貢獻1836條經驗 獲得超13個贊

arr1 = np.tensordot(A.T,t,axes=1).T

arr1

array([[ 10,  31,  52,  73],

       [ 94, 115, 136, 157],

       [178, 199, 220, 241]])


查看完整回答
反對 回復 2022-09-20
?
胡子哥哥

TA貢獻1825條經驗 獲得超6個贊

像@alyhosny建議的那樣使用張量是有效的,但是使用零替換掩蔽的值


A = np.ma.MaskedArray.filled(A,0)

在與einsum求和之前(感謝@phipsgabler)給了一半的運行時間。最終代碼:


A = np.ma.MaskedArray(A,mask)

A = np.ma.MaskedArray.filled(A,0)

return np.einsum('ijk,i->jk',A,t)


查看完整回答
反對 回復 2022-09-20
  • 2 回答
  • 0 關注
  • 118 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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