我有以下数组:
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中是否有一种有效的方法,可以避免多个循环? 最好
答案 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 ... ]
,其中a1
和a2
“几乎相同”;我们要删除哪一个?这很容易解决:选择第一个。
第二个:假设我们有一个数组[ b1 ... bN ]
,其中bi
和bi+1
几乎相同,但是bi
和bi+2
是不是几乎相同。我们要删除哪些?在这种情况下,我想您可以删除所有奇数条目或所有偶数条目。
第三:在中途情况下,如果您有几乎完全相同的连续对的混合搭配?处方是什么?
我认为问题与“几乎相同”不具有传递性的事实有关,与“严格相同”不同。这建议采用以下方法,该方法为“几乎相同”定义了一些不同的标准:定义将行映射为“ OK行”的哈希函数;例如,将行的所有元素四舍五入为偶数。然后将“几乎相同”定义为映射到同一“确定行”的所有行。您可以定义一个从“确定行”到a
中几乎相同的行的列表的映射,并返回每个列表的第一个元素。
也许更多地了解该问题会有所帮助。例如,我正在处理一个涉及大量时间序列的问题。我想使用SARIMA预测每个系列的下一个值。但是,为每个系列建立一个SARIMA模型的成本高得令人望而却步,所以(简而言之),我要做的是使用K值均值为K的K-Means聚类对系列进行聚类,从而可以构建K个SARIMA模型。在这种情况下,我<希望> 是同一集群中不同系列的“几乎相同”,因此一个预测对这两个都有用。