【发布时间】:2013-07-22 13:56:05
【问题描述】:
假设我有一个长度为 4 的 numpy 数组:
In [41]: arr
Out[41]:
array([[ 1, 15, 0, 0],
[ 30, 10, 0, 0],
[ 30, 20, 0, 0],
...,
[104, 139, 146, 75],
[ 9, 11, 146, 74],
[ 9, 138, 146, 75]], dtype=uint8)
我想知道:
-
arr包含[1, 2, 3, 4]是真的吗? - 如果是真的,
[1, 2, 3, 4]在arr中的索引是多少?
我想尽快找到它。
假设 arr 包含 8550420 个元素。我用timeit检查了几种方法:
- 仅用于检查而不获取索引:
any(all([1, 2, 3, 4] == elt) for elt in arr)。在我的机器上运行 10 次平均需要 15.5 秒 -
基于
for的解决方案:for i,e in enumerate(arr): if list(e) == [1, 2, 3, 4]: break平均耗时约 5.7 秒
是否存在一些更快的解决方案,例如基于 numpy 的解决方案?
【问题讨论】:
-
如果你不关心额外的内存,你可以创建字典,其中键是从列表中创建的元组
-
但这会节省一些时间吗?从我的数组中制作元组字典需要时间。
-
这取决于,如果您多次执行搜索,肯定会为您节省一些时间
-
我认为这个答案可能会有所帮助 - stackoverflow.com/a/17797247/2452770。将
where与all结合使用可能是最快的查找方式。
标签: python arrays search numpy multidimensional-array