Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 比较数组列表中是否存在重叠_Python_Arrays_Numpy - Fatal编程技术网

Python 比较数组列表中是否存在重叠

Python 比较数组列表中是否存在重叠,python,arrays,numpy,Python,Arrays,Numpy,我有一个数组列表,其形式为[a,[b,c,d]],类似于 dataset=[1,数组[1,2,3,4],[0.5,数组[2,2,3,5],[1.5,数组[4,3,2,1],…] 我想比较每个数组并确定它们之间的重叠量。在上面的示例中,这将意味着识别[[1,数组[1,2,3,4],[0.5,数组[2,2,3,5],…]。我关心重叠的值和位置 如果超过某个阈值(比如1/3)重叠,我想从数据集中消除系数较低的值。在上面的示例中,这将是第二个数组,其值为0.5,而不是1 对于上述列表,输出为: [[1

我有一个数组列表,其形式为[a,[b,c,d]],类似于

dataset=[1,数组[1,2,3,4],[0.5,数组[2,2,3,5],[1.5,数组[4,3,2,1],…]

我想比较每个数组并确定它们之间的重叠量。在上面的示例中,这将意味着识别[[1,数组[1,2,3,4],[0.5,数组[2,2,3,5],…]。我关心重叠的值和位置

如果超过某个阈值(比如1/3)重叠,我想从数据集中消除系数较低的值。在上面的示例中,这将是第二个数组,其值为0.5,而不是1

对于上述列表,输出为:

 [[1, array[1, 2, 3, 4]], [1.5, array[4, 3, 2, 1]], ...]
我已经设法找到了一个解决方案(如下),但速度非常慢。我确信有更好的方法来解决这个问题,我只是不确定它是什么

survivors = dataset
for i, pair in enumerate(dataset):
        keep_arr = [veto_duplicate(pair, dup) for dup in survivors]
        survivors = list(compress(survivors,keep_arr))
return survivors

def veto_duplicate(path1, path2):
        fractional_overlap = sum(path1[1] == path2[1])/len(path1[1])
        if fractional_overlap > 0.25 and fractional_overlap < 1:
                        if path1[0] < path2[0]:
                                return False
                        else:
                                return True
        else:
                return True
幸存者=数据集 对于i,枚举(数据集)中的配对: keep_arr=[否决幸存者中dup的重复(配对,dup)] 幸存者=列表(压缩(幸存者,保留) 返回幸存者 def否决权重复(路径1,路径2): 分数重叠=和(路径1[1]==路径2[1])/len(路径1[1]) 如果分数重叠>0.25且分数重叠<1: 如果路径1[0]<路径2[0]: 返回错误 其他: 返回真值 其他: 返回真值 如果有人能提出一个更快的方法,我将非常感激

编辑


所有内部数组的大小都相同。最终结果不应包含重叠的数组。如果有三个(或更多)重叠的数组,我只想保留系数最高的一个。

这里有一个更快的解决方案。希望有帮助:

dataset = [[1, np.array([1, 2, 3, 4])], [0.5, np.array([2, 2, 3, 5])], [1.5, np.array([4, 3, 2, 1])]]
#sort dataset by first element
dataset.sort(key=lambda x:x[0])
#unnormalize threshold to reduce division everytime
threshold = 1/3 * len(dataset[0][1])
survivors = dataset.copy()
id_to_del = []
for i, pair in enumerate(dataset):
    for dup in dataset[i+1:]:
        if sum(pair[1]==dup[1])>threshold:
            id_to_del.append(i)
            break

for i in id_to_del:
    del(survivors[i])
#converting to numpy and deleting might be faster if list is too long, but requires reformatting:
#survivors = np.delete(np.array(survivors), id_to_del, axis=0)
输出:

[[1, array([1, 2, 3, 4])], [1.5, array([4, 3, 2, 1])], ...]

这里有一个更快的解决方案。希望有帮助:

dataset = [[1, np.array([1, 2, 3, 4])], [0.5, np.array([2, 2, 3, 5])], [1.5, np.array([4, 3, 2, 1])]]
#sort dataset by first element
dataset.sort(key=lambda x:x[0])
#unnormalize threshold to reduce division everytime
threshold = 1/3 * len(dataset[0][1])
survivors = dataset.copy()
id_to_del = []
for i, pair in enumerate(dataset):
    for dup in dataset[i+1:]:
        if sum(pair[1]==dup[1])>threshold:
            id_to_del.append(i)
            break

for i in id_to_del:
    del(survivors[i])
#converting to numpy and deleting might be faster if list is too long, but requires reformatting:
#survivors = np.delete(np.array(survivors), id_to_del, axis=0)
输出:

[[1, array([1, 2, 3, 4])], [1.5, array([4, 3, 2, 1])], ...]

不要屏住呼吸。这不是那种需要快速编译方法的完整数组问题。所有内部数组的大小都相同吗?如果三个数组的成对重叠超过阈值会怎么样?您希望如何处理这种情况?嗨,Ehsan,我编辑了这篇文章来回答您的问题,但简而言之:所有数组的大小都相同,对于N个重叠数组,我只想要系数最高的一个。@Atalasexp谢谢。您可以减少重复计数和一些操作开销,但我不确定您是否可以在更短的时间内完成这项工作。我会发布一个解决方案,不要屏住呼吸。这不是那种需要快速编译方法的完整数组问题。所有内部数组的大小都相同吗?如果三个数组的成对重叠超过阈值会怎么样?您希望如何处理这种情况?嗨,Ehsan,我编辑了这篇文章来回答您的问题,但简而言之:所有数组的大小都相同,对于N个重叠数组,我只想要系数最高的一个。@Atalasexp谢谢。您可以减少重复计数和一些操作开销,但我不确定您是否可以在更短的时间内完成这项工作。我将发布一个解决方案。太棒了,当我将它应用到我的完整数据集时,这大约是时间的一半。谢谢。太棒了,当我将它应用到我的完整数据集时,这大约是时间的一半。谢谢