![](/img/trans.png)
[英]Python most efficient way to find index of maximum in partially changed array
[英]More efficient way to find index of objects in Python array
我有一個非常大的400x300x60x27陣列(我們稱其為“ A”)。 我取了最大值,現在是一個名為“ B”的400x300x60數組。 基本上,我需要在“ A”中找到“ B”中每個值的索引。 我已經將它們都轉換為列表,並建立了一個for循環來查找索引,但是由於有超過700萬個值,因此花了很長時間才能完成索引。 這就是我所擁有的:
B=np.zeros((400,300,60))
C=np.zeros((400*300*60))
B=np.amax(A,axis=3)
A=np.ravel(A)
A=A.tolist()
B=np.ravel(B)
B=B.tolist()
for i in range(0,400*300*60):
C[i]=A.index(B[i])
有沒有更有效的方法可以做到這一點? 它花費了數小時,並且程序仍然停留在最后一行。
您不需要amax,您需要argmax。 在argmax的情況下,數組將僅包含索引而不是值,使用索引查找值的計算效率要好得多,反之亦然。
因此,我建議您僅存儲索引。 在展平陣列之前。
代替np.amax,運行A.argmax,它將包含索引。 但是在將其展平為一維之前,您將需要使用一個映射函數,該函數也會使索引也變為一維。 這可能是一個瑣碎的問題,因為您只需使用一些基本操作即可實現此目的。 但這也將花費一些時間,因為它需要執行很多次。 但這不是搜索探針,可以為您節省很多時間。
您將獲得這些argmax
索引,並且由於扁平化,您基本上將其轉換為那些線性索引的等效項。
因此,一種解決方案是在適當的偏移量中逐步增加argmax
索引,以利用在每個索引處的broadcasting
,就像這樣-
m,n,r,s = A.shape
idx = A.argmax(axis=3)
idx += s*np.arange(r)
idx += r*s*np.arange(n)[:,None]
idx += n*r*s*np.arange(m)[:,None,None] # idx is your C output
另外,一種緊湊的表達方式是這樣的-
m,n,r,s = A.shape
I,J,K = np.ogrid[:m,:n,:r]
idx = n*r*s*I + r*s*J + s*K + A.argmax(axis=3)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.