我有一個尺寸為 (nz,ny,nx) 的特定矩陣和另一個尺寸為 (ny,nx) 的矩陣。在這個其他矩陣中是特定值,例如,我想在第二個矩陣具有特定值的位置對第一個 3 維矩陣中的所有點求和。
我正在執行以下操作:
kkw = np.squeeze(np.where(wz==wval))
其中有 (2,X) 元素,當我現在嘗試這樣做時:
serout = np.sum(dum[:,kkw],axis=(1,2))
我以完全錯誤的東西結束,甚至使用大量記憶體并最終被殺死。
使用另一個掩碼矩陣和特定掩碼值來計算原始矩陣中的值的正確方法是什么?
這是問題的一個小例子:
nz,ny,nx = 3,20,10
datain = np.random.random((nz,ny,nx))
mask = np.array(5 5.*np.random.random((ny,nx)),dtype='int');
kkw = np.squeeze(np.where(mask==5))
dataout = np.sum(datain[:,kkw],axis=(1,2))
所以,最后我希望dataout有 3 個元素,但它有尺寸 (3,20)。顯然,我沒有正確地進行廣播。
uj5u.com熱心網友回復:
您的示例陣列:
In [165]: nz,ny,nx = 3,20,10
...: datain = np.random.random((nz,ny,nx))
...: mask = np.array(5 5.*np.random.random((ny,nx)),dtype='int');
...:
In [166]: datain.shape
Out[166]: (3, 20, 10)
In [167]: mask.shape
Out[167]: (20, 10)
指數哪里mask是 5:
In [170]: np.where(mask==5)
Out[170]:
(array([ 0, 0, 0, 0, 1, 1, 1, 2, 3, 3, 3, 4, 4, 4, 4, 5, 6,
6, 6, 7, 7, 8, 8, 9, 9, 9, 9, 10, 10, 10, 11, 12, 13, 13,
13, 13, 13, 15, 15, 15, 16, 16, 17, 17, 17, 18, 18, 18, 18, 18, 19,
19]),
array([1, 3, 6, 9, 3, 6, 8, 9, 1, 5, 7, 0, 2, 3, 6, 9, 1, 6, 9, 8, 9, 3,
5, 1, 3, 4, 8, 0, 4, 9, 0, 2, 0, 3, 5, 6, 8, 2, 5, 9, 0, 1, 2, 5,
8, 0, 4, 6, 8, 9, 3, 7]))
我還沒有看到squeeze應用于此,但它所做的只是將陣列的元組轉換為 (2,52) 陣列。 np.argwhereapply np.transpose,產生一個 (52,2) 陣列。
In [171]: np.squeeze(_)
Out[171]:
array([[ 0, 0, 0, 0, 1, 1, 1, 2, 3, 3, 3, 4, 4, 4, 4, 5,
6, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9, 10, 10, 10, 11, 12,
13, 13, 13, 13, 13, 15, 15, 15, 16, 16, 17, 17, 17, 18, 18, 18,
18, 18, 19, 19],
[ 1, 3, 6, 9, 3, 6, 8, 9, 1, 5, 7, 0, 2, 3, 6, 9,
1, 6, 9, 8, 9, 3, 5, 1, 3, 4, 8, 0, 4, 9, 0, 2,
0, 3, 5, 6, 8, 2, 5, 9, 0, 1, 2, 5, 8, 0, 4, 6,
8, 9, 3, 7]])
元where組在索引時更容易使用。
In [172]: I,J = np.where(mask==5)
In [173]: I.shape
Out[173]: (52,)
應用于mask自身,我們得到所有5值:
In [174]: mask[I,J]
Out[174]:
array([5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5])
應用于 3d 陣列:
In [175]: datain[:,I,J].shape
Out[175]: (3, 52)
In [176]: datain[:,I,J].sum(axis=1)
Out[176]: array([28.01960227, 26.66364387, 26.24709875])
datain[:,kkw]產生一個 (3,2,52,10) 陣列。它應用 (2,52) 陣列來索引大小為 20 的維度。將where元組轉換為二維陣列對索引沒有幫助。索引時,元組、串列和陣列之間的區別非常重要。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/453062.html
