我试图找到最快的方法来找到二维排序数组中每一行的第一个非零值。从技术上讲,数组中唯一的值是0和1,它是“排序的”。
例如,数组可以如下所示:
v=
0 0 0 1 1 1 1
0 0 0 1 1 1 1
0 0 0 0 1 1 1
0 0 0 0 0 0 1
0 0 0 0 0 0 1
0 0 0 0 0 0 1
0 0 0 0 0 0 0
我可以使用argmax函数
argmax(v, axis=1))
当它从0变为1时查找,但我相信这将对每一行进行详尽的搜索。我的阵列大小是合理的(~2000x2000)。对于for循环中的每一行,argmax的性能是否仍然优于仅对其执行searchsorted方法,或者是否有更好的替代方法?
此外,数组始终是这样的:行的第一个位置总是>;=其上一行的第一个位置(但不能保证最后几行中会有一个)。我可以用for循环和“起始索引值”来利用它,每一行的起始索引值等于前一行的第一个1的位置,但我是否正确地认为numpy argmax函数仍将优于用python编写的循环。
我只需要对备选方案进行基准测试,但是阵列的边长可能会有很大的变化(从250到10000)。
使用np.where相当快:
传递值的to坐标大于0的元组。
也可以使用np.where测试每个子数组:
印刷品:
即,第0行:索引3>;0;第4行:索引4>;0;第6行:没有索引大于0
正如您所怀疑的,argmax可能更快:
如果您可以处理不为所有零行设置
None
的逻辑,则速度更快:下面是一个在argmax中使用axis的版本(如您在评论中建议的那样):
对于速度比较(在示例数组中),我得到:
如果我把它扩展到一个2000 X 2000 np阵列,我得到的是:
argmax()使用C级循环,比Python循环快得多,所以我想即使你用Python编写了一个智能算法,也很难打败argmax(),你可以使用Cython来加速:
在我的2000x2000矩阵电脑上,是100us对3ms
相关问题 更多 >
编程相关推荐