我有两个数组arr1
和arr2
,大小分别为(90000,1)
和(120000,1)
。我想知道arr1
的axis=0
的任何元素是否存在于arr2
上。然后将他们的位置写在一个列表上,然后将其删除。这将确保在另一个列表上找不到任何一个列表上的元素。现在,我正在使用for
循环:
list_conflict=[]
for i in range (len(arr1)):
for j in range (len(arr2)):
if (arr1[i]==arr2[j]):
list_conflict.append([i,j])
fault_index_pos = np.unique([x[0] for x in list_conflict])
fault_index_neg = np.unique([x[1] for x in list_conflict])
X_neg = np.delete(X_neg,fault_index_neg,axis=0)
X_pos = np.delete(X_pos,fault_index_pos,axis=0)
它在外循环上获取arr1
元素,并将其与arr2
的每个元素进行详尽的比较。如果找到匹配项,则附加索引list_conflict
,第一个元素为arr1
位置,第二个元素为arr2
。然后fault_index_pos
和fault_index_neg
被压缩到唯一的元素中,因为arr1
的元素可能位于arr2
的多个位置上,并且列表将具有循环位置。最后,通过将fault_index
列表作为要删除的索引,使用np.delete
删除匹配元素
我正在寻找一种更快的冲突比较方法,称之为multiprocessing
、vectorization
或其他任何方法。你可以说这不会花费太多时间,但实际上数组是(x,8,10)
维的,但为了清晰起见,我缩短了它们
忽略numpy部分,在纯Python中查找冲突索引对的速度要快得多,所需时间与
len(a)
加上len(b)
加上冲突的数量成比例,而不是与向量长度的乘积成比例的嵌套循环:然后,例如
显示
这是2和4的匹配出现的索引
请学习一些有关NumPy向量功能的教程,以及Python的序列包含运算符。您正在尝试编写一个大型应用程序,该应用程序非常需要您尚未学习的语言工具
这就是说,也许最快的方法是将每个转换为
set
并取集合的交点。对于一个序列/一组n元素,所涉及的操作是O(n);嵌套循环是O(N*M)(在两个序列大小上)任何关于Python集的教程都将引导您完成这一过程
价值观
仅使用numpy
timeit
相关问题 更多 >
编程相关推荐