繁体   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