python – 检查numpy数组的子维度中的元素是否在另一个numpy数组的子维度中的快速方法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 检查numpy数组的子维度中的元素是否在另一个numpy数组的子维度中的快速方法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1191字,纯文字阅读大概需要2分钟。
内容图文
![python – 检查numpy数组的子维度中的元素是否在另一个numpy数组的子维度中的快速方法](/upload/InfoBanner/zyjiaocheng/797/16ed404d08b84aedb1e18343b29ee948.jpg)
假设我们有两个整数numpy数组A和B大小(N,M).我想检查N中的每一个,是B [i,:]中的A [i,:].
for循环实现是:
for i in range(N):
C[i] = np.isin(A[i,:],B[i,:])
然而,对于大型阵列来说这是非常慢的.有没有更快的方法来实现这个? (例如矢量化?)
谢谢!
解决方法:
这是一种基于每行偏移的矢量化方法,如Vectorized searchsorted numpy's solution中更详细的讨论 –
# https://stackoverflow.com/a/40588862/ @Divakar
def searchsorted2d(a,b):
m,n = a.shape
max_num = np.maximum(a.max() - a.min(), b.max() - b.min()) + 1
r = max_num*np.arange(a.shape[0])[:,None]
p = np.searchsorted( (a+r).ravel(), (b+r).ravel() ).reshape(m,-1)
return p - n*(np.arange(m)[:,None])
def numpy_isin2D(A,B):
sB = np.sort(B,axis=1)
idx = searchsorted2d(sB,A)
idx[idx==sB.shape[1]] = 0
return np.take_along_axis(sB, idx, axis=1) == A
样品运行 –
In [351]: A
Out[351]:
array([[5, 0, 3, 3],
[7, 3, 5, 2],
[4, 7, 6, 8],
[8, 1, 6, 7],
[7, 8, 1, 5]])
In [352]: B
Out[352]:
array([[8, 4, 3, 0, 3, 5],
[0, 2, 3, 8, 1, 3],
[3, 3, 7, 0, 1, 0],
[4, 7, 3, 2, 7, 2],
[0, 0, 4, 5, 5, 6]])
In [353]: numpy_isin2D(A,B)
Out[353]:
array([[ True, True, True, True],
[False, True, False, True],
[False, True, False, False],
[False, False, False, True],
[False, False, False, True]])
内容总结
以上是互联网集市为您收集整理的python – 检查numpy数组的子维度中的元素是否在另一个numpy数组的子维度中的快速方法全部内容,希望文章能够帮你解决python – 检查numpy数组的子维度中的元素是否在另一个numpy数组的子维度中的快速方法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。