gpt4 book ai didi

matlab - 找到聚集的 NaN,但单独留下单独的 NaN

转载 作者:太空宇宙 更新时间:2023-11-03 20:14:22 25 4
gpt4 key购买 nike

我有一个不完整的数据集,

http://imgur.com/Tpu6Hcf

N = [NaN 1 2 3 NaN 5 6 NaN NaN 7 8 10 12 20 NaN NaN NaN NaN NaN]'

我想识别一个 Nans 簇,也就是说,如果它们的后续数量超过 2,我该怎么做?

最佳答案

你可以这样做:

aux = diff([0; isnan(N); 0]);
clusters = [find(aux == 1) find(aux == -1) - 1];

然后集群将是一个 Nx2 矩阵,其中 N 是 NaN 集群(所有集群)的数量,每一行都为您提供集群的开始和结束索引。

在这个例子中,这将是:

clusters =

1 1
5 5
8 9
15 19

这意味着您有 4 个 NaN 簇,第一个簇的范围从索引 1 到索引 1,第二个簇的范围从 5 到 5,第三个簇的范围从 8 到 9,第四个簇的范围从 15 到 19。

如果您只想要至少有 K 个 NaN 的簇,您可以这样做(例如,K = 2):

K = 2;
clusters(clusters(:,2) - clusters(:,1) + 1 >= K, :)

这会给你这个:

ans =

8 9
15 19

也就是说,簇 8-9 和 15-19 有 2 个或更多 NaN。

解释:

  • 寻找集群

isnan(N) 为您提供一个包含 NaN 的逻辑向量:

N --------> NaN 1  2  3 NaN 5  6 NaN NaN 7  8 10 12 20 NaN NaN NaN NaN NaN
isnan(N) -> 1 0 0 0 1 0 0 1 1 0 0 0 0 0 1 1 1 1 1

我们想知道每个 1 序列从哪里开始,所以我们使用 diff,它计算每个值减去前一个值,并给我们这个:

aux = diff(isnan(N));
N ----> NaN 1 2 3 NaN 5 6 NaN NaN 7 8 10 12 20 NaN NaN NaN NaN NaN
aux --> -1 0 0 1 -1 0 1 0 -1 0 0 0 0 1 0 0 0 0

1 表示组开始,-1 表示组结束。但它错过了第一个组开始和最后一个组结束,因为第一个 1 元素不存在(它在 N 上没有前一个,因为它是第一个)并且最后一个 -1 也不存在(因为在 N 上的最后一个 1 之后没有任何内容)。一个常见的修复方法是在数组前后添加一个零,这给了我们这个:

aux = diff([0; isnan(N); 0]);
N ----> NaN 1 2 3 NaN 5 6 NaN NaN 7 8 10 12 20 NaN NaN NaN NaN NaN
aux --> 1 -1 0 0 1 -1 0 1 0 -1 0 0 0 0 1 0 0 0 0 -1

注意两件事:

  1. 如果索引 i 处的差异为 1,则 N(i) 是 NaN block 的开始。
  2. 如果索引 i 处的差异是 -1,则 N(i - 1) 是结束NaN block 。

为了获得起点和终点,我们使用find 来获得aux == 1 和aux == -1 的索引。因此,我们两次调用 find,并使用 [] 连接这两个调用:

aux = diff([0; isnan(N); 0]);
clusters = [find(aux == 1) find(aux == -1) - 1];
  • 过滤包含K个或更多元素的簇

最后一步是找到具有 K 个或更多元素的簇。为此,我们首先获取簇矩阵并从第一列中减去第一列,然后添加 1,如下所示:

clusters(:,2) - clusters(:,1) + 1
ans =
1
1
2
5

这意味着簇 1 和 2 有 1 个 NaN,簇 3 有 3 个 NaN,簇 4 有 5 个 NaN。如果我们询问哪些值大于或等于 K,我们会得到:

clusters(:,2) - clusters(:,1) + 1 >= K
ans =
0
0
1
1

这是一个逻辑数组。我们可以使用它来仅索引簇矩阵的 1 (true) 行,如下所示:

clusters(clusters(:,2) - clusters(:,1) + 1 >= K, :)
ans =

8 9
15 19

这就像在问:只给我们行与该逻辑向量上的行匹配的集群,并给我们所有列(由 : 表示)。

关于matlab - 找到聚集的 NaN,但单独留下单独的 NaN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23035517/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com