比较数组中的行值,并删除具有几乎相同值的行值

时间:2019-12-14 15:38:01

标签: python arrays numpy

我有以下数组:

import 'package:<your_extention_path>/file_extentions.dart';

我想比较行并删除具有几乎相同值的行。 例如[2,3,50]和[1,3,51]几乎相同(每个值的差小于1)。

最后,我应该得到以下数组:

a= [[2,3,50], [5,6,5], [8,10,5], [1,3,51] , [8,10,12]]

其中[1,3,51]已被删除。 在Python中是否有一种有效的方法,可以避免多个循环? 最好

2 个答案:

答案 0 :(得分:1)

我们可以在两个a版本的第一个轴上执行外部减法,然后求出绝对值,并检查沿公共轴的所有值是否都小于或等于{{ 1}}。这将为我们提供1蒙版。我们需要选择上部的三角形遮罩,以确保相邻的对不超过一次。重置与自己的情况相对应的对角线。最后,检查每个列中是否至少有匹配项,这是我们需要删除的最接近的匹配项。因此,请反转遮罩并从2D中选择行。

实施方式为-

a

逐步执行的示例应该有助于弄清楚。

输入数组:

a[~np.triu((np.abs(a[:,None,:]-a)<=1).all(2),1).any(0)]

步骤:

In [112]: a
Out[112]: 
array([[ 2,  3, 50],
       [ 5,  6,  5],
       [ 8, 10,  5],
       [ 1,  3, 51],
       [ 8, 10, 12]])

只需要再进行一轮验证,就将最后一行设置为倒数第二行的另一列。这也将导致最后一行也被删除。因此-

In [114]: (np.abs(a[:,None,:]-a)<=1).all(2)
Out[114]: 
array([[ True, False, False,  True, False],
       [False,  True, False, False, False],
       [False, False,  True, False, False],
       [ True, False, False,  True, False],
       [False, False, False, False,  True]])

In [115]: np.triu((np.abs(a[:,None,:]-a)<=1).all(2),1)
Out[115]: 
array([[False, False, False,  True, False],
       [False, False, False, False, False],
       [False, False, False, False, False],
       [False, False, False, False, False],
       [False, False, False, False, False]])

In [116]: np.triu((np.abs(a[:,None,:]-a)<=1).all(2),1).any(0)
Out[116]: array([False, False, False,  True, False])

In [117]: ~np.triu((np.abs(a[:,None,:]-a)<=1).all(2),1).any(0)
Out[117]: array([ True,  True,  True, False,  True])

In [118]: a[~np.triu((np.abs(a[:,None,:]-a)<=1).all(2),1).any(0)]
Out[118]: 
array([[ 2,  3, 50],
       [ 5,  6,  5],
       [ 8, 10,  5],
       [ 8, 10, 12]])

具有一个提高内存效率的循环

我们可以使用一个循环来节省内存,从而在那方面保持高效,还可以在过程中使用切片-

In [120]: a[-1] = [0,3,52]

In [122]: a
Out[122]: 
array([[ 2,  3, 50],
       [ 5,  6,  5],
       [ 8, 10,  5],
       [ 1,  3, 51],
       [ 0,  3, 52]])

In [123]: a[~np.triu((np.abs(a[:,None,:]-a)<=1).all(2),1).any(0)]
Out[123]: 
array([[ 2,  3, 50],
       [ 5,  6,  5],
       [ 8, 10,  5]])

答案 1 :(得分:0)

有关问题定义的几个问题。

首先:假设我们有一个数组[ ... a1 ... a2 ... ],其中a1a2“几乎相同”;我们要删除哪一个?这很容易解决:选择第一个。

第二个:假设我们有一个数组[ b1 ... bN ],其中bibi+1几乎相同,但是bibi+2不是几乎相同。我们要删除哪些?在这种情况下,我想您可以删除所有奇数条目或所有偶数条目。

第三:在中途情况下,如果您有几乎完全相同的连续对的混合搭配?处方是什么?

我认为问题与“几乎相同”不具有传递性的事实有关,与“严格相同”不同。这建议采用以下方法,该方法为“几乎相同”定义了一些不同的标准:定义将行映射为“ OK行”的哈希函数;例如,将行的所有元素四舍五入为偶数。然后将“几乎相同”定义为映射到同一“确定行”的所有行。您可以定义一个从“确定行”到a中几乎相同的行的列表的映射,并返回每个列表的第一个元素。

也许更多地了解该问题会有所帮助。例如,我正在处理一个涉及大量时间序列的问题。我想使用SARIMA预测每个系列的下一个值。但是,为每个系列建立一个SARIMA模型的成本高得令人望而却步,所以(简而言之),我要做的是使用K值均值为K的K-Means聚类对系列进行聚类,从而可以构建K个SARIMA模型。在这种情况下,我<希望> 是同一集群中不同系列的“几乎相同”,因此一个预测对这两个都有用。