簡體   English   中英

在Python數組中查找對象索引的更有效方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM