【发布时间】:2020-07-31 13:02:57
【问题描述】:
我有四个一维np.arrays:x1, y1, x2, y2,其中x1和y2具有相同的长度,x2和y2也具有相同的长度,因为它们是对应的x和y值对于一个数据集。 len(x1) 和 len(x2) 总是不同的。我们现在假设len(x1) > len(x2)。这两个数组总是有共同的值,但是以一种特殊的方式:这些值并不完全相同,只是在一个公差范围内(因为数值错误等)。容差 = 0.01 的示例:
x1 = np.array([0, 1.01, 1.09, 1.53, -9.001, 1.2, -52, 1.011])
x2 = np.array([1, 1.1, 1.2, 1.5, -9, 82])
我只想保留公共值(以容差方式)。使用较短的数组作为参考,在本例中为 x2。 x2中的第一个值是1,在x1中有一个对应的值,即1.01。 Next:1.2在x2、1.2中也有对应的值。 1.5的值没有对应的值,因为1.53超差,所以过滤掉等等。
完整的结果应该是:
x1 = np.array([1.01, 1.09, -9.001, 1.2])
x2 = np.array([1, 1.1, -9, 1.2])
为了更进一步,基于以这种方式过滤 x 值,我想过滤两个数据集的相同索引的 y 值,换句话说,我想找到两个数据集的最长公共子序列。请注意,这里的排序很重要,因为它与 y 值相关(如果我们先对 x 进行 argsort 排序并重新索引 x 和 y 并不重要)。
我根据this的答案尝试了什么:
def longest_common_subseq(x1, x2, y1, y2, tol=0.02):
# sort them first to keep x and y connected
idx1 = np.argsort(x1)
x1, y1 = x1[idx1], y1[idx1]
idx2 = np.argsort(x2)
x2, y2 = x2[idx2], y2[idx2]
# here I assumed that len(x2) < len(x1)
idx = (np.abs(x1[:,None] - x2) <= tol).any(axis=1)
return x1[idx], x2[idx], y1[idx], y2[idx]
在这种情况下,y 值可以是任意的,只有形状必须与x1 和x2 匹配。例如:
y1 = np.array([0, 1, 2, 3, 4, 5, 6, 7])
y2 = np.array([-1, 0, 3, 7, 11, -2])
尝试运行上面的函数引发
IndexError: boolean index did not match indexed array along dimension 0.
我明白:索引数组的长度是错误的,因为x1 和x2 的长度不同,到目前为止我做不到。有没有很好的方法来实现这一点?
编辑:
如果多个值在公差范围内,则应选择最接近的值。
【问题讨论】:
-
任务定义不够好。如果
x1=[1, 1.02, 1.03]和x2=[1.021, 1.017]会发生什么?多个答案在tol=0.02之内,x1中的相同答案最接近x2中的不同元素。什么是正确的配对? -
@Aguy 这几乎肯定不会发生,因为
x1和x2原本是相同的数组,其中一个只是经过切片和某些操作。您提到的正确答案是x1=[1.02],x2=[1.021]。我们使用较短的数组作为参考,遍历它的元素,查看x2中是否有任何对应的值对应所需的tol,然后选择最接近的。一旦我们选择了一个值,我们需要在之后排除它以避免重复。我知道这听起来很复杂,我同意它的定义不够好,也许我稍后会改写这个问题。