更有效的方法来查找Python数组中的对象索引

时间:2017-07-23 16:47:49

标签: python arrays numpy indexing

我有一个非常大的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;
        });
    }
}

有更有效的方法吗?它耗时数小时,程序仍然停留在最后一行。

2 个答案:

答案 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)