我有一个非常大的400x300x60x27阵列(让我们称之为' A')。我拿了最大值,这个值现在是一个名为' B'的400x300x60阵列。基本上我需要找到A' A'在' B'中的每个值。我已将它们转换为列表并设置for循环以查找索引,但是需要花费很长的时间来完成它,因为有超过700万个值。这就是我所拥有的:
import { Block } from '...' // the place where you saved the response interface
@Component({
selector: 'app-editor',
templateUrl: './editor.component.html',
styleUrls: ['./editor.component.css']
//providers: [EditorService] dont provide the service directly in the component decorator. Instead, add the service to the providers array of you app.module. If you provide it here, a new instance of the EditorSerice will be created every time a this component is created. You want services to be singletone.
})
export class EditorComponent implements OnInit {
blocks: Block[];
constructor(private editorService: EditorService) {}
ngOnInit() {
this.editorService.getBlocks()
.subscribe(res => {
this.blocks= blocks;
});
}
}
有更有效的方法吗?它耗时数小时,程序仍然停留在最后一行。
答案 0 :(得分:1)
你不需要amax,你需要argmax。在argmax的情况下,数组只包含索引而不是值,使用索引查找值的计算效率要好得多,反之亦然。
所以,我建议你只存储索引。在展平阵列之前。
代替np.amax,运行A.argmax,这将包含索引。 但在将其展平为1D之前,您需要使用导致索引为1D的映射函数。这可能是一个微不足道的问题,因为您需要使用一些基本操作来实现这一目标。但这也需要花费一些时间,因为它需要执行很多次。但它不会成为一个搜索探测器,并且会为你节省很多时间。
答案 1 :(得分:1)
您正在获得这些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)