python – 在数组数组中查找数组索引的快速方法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 在数组数组中查找数组索引的快速方法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1848字,纯文字阅读大概需要3分钟。
内容图文
![python – 在数组数组中查找数组索引的快速方法](/upload/InfoBanner/zyjiaocheng/732/36f95ba56a1f4e59b672beda11e745eb.jpg)
假设我有一个长度为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包含8550420个元素.我用timeit检查了几种方法:
>只是为了检查而没有获得索引:任何(所有([1,2,3,4] == elt)为arr中的elt).在我的机器上运行10次,平均花费了15.5秒
>基于for的解决方案:
for i,e in enumerate(arr):
如果列表(e)== [1,2,3,4]:
打破
它平均花了大约5.7秒
是否存在一些更快的解决方案,例如基于numpy?
解决方法:
这是Jaime’s idea,我只是喜欢它:
import numpy as np
def asvoid(arr):
"""View the array as dtype np.void (bytes)
This collapses ND-arrays to 1D-arrays, so you can perform 1D operations on them.
https://stackoverflow.com/a/16216866/190597 (Jaime)"""
arr = np.ascontiguousarray(arr)
return arr.view(np.dtype((np.void, arr.dtype.itemsize * arr.shape[-1])))
def find_index(arr, x):
arr_as1d = asvoid(arr)
x = asvoid(x)
return np.nonzero(arr_as1d == x)[0]
arr = np.array([[ 1, 15, 0, 0],
[ 30, 10, 0, 0],
[ 30, 20, 0, 0],
[1, 2, 3, 4],
[104, 139, 146, 75],
[ 9, 11, 146, 74],
[ 9, 138, 146, 75]], dtype='uint8')
arr = np.tile(arr,(1221488,1))
x = np.array([1,2,3,4], dtype='uint8')
print(find_index(arr, x))
产量
[ 3 10 17 ..., 8550398 8550405 8550412]
我们的想法是将数组的每一行视为一个字符串.例如,
In [15]: x
Out[15]:
array([^A^B^C^D],
dtype='|V4')
这些字符串看起来像垃圾,但它们实际上只是每行被视为字节的基础数据.然后,您可以比较arr_as1d == x以查找哪些行等于x.
def find_index2(arr, x):
return np.where((arr == x).all(axis=1))[0]
但事实证明并不那么快:
In [34]: %timeit find_index(arr, x)
1 loops, best of 3: 209 ms per loop
In [35]: %timeit find_index2(arr, x)
1 loops, best of 3: 370 ms per loop
内容总结
以上是互联网集市为您收集整理的python – 在数组数组中查找数组索引的快速方法全部内容,希望文章能够帮你解决python – 在数组数组中查找数组索引的快速方法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。