![](/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.