提取数组中非 NaN 元素的索引和值的正确方法

Posted

技术标签:

【中文标题】提取数组中非 NaN 元素的索引和值的正确方法【英文标题】:Correct way of extracting indices and values of non-NaN elements in an array 【发布时间】:2014-02-20 05:55:42 【问题描述】:

我有一个包含数字和 NaN 元素的数据数组。我想获得 3 个向量,其中包含该数组的非 NaN 元素的索引和各自的值。

这是我的做法:

[x,y]=find(~isnan(A));
[~,~,z]=find(A(~isnan(A)));

现在,这不是最佳选择。首先z 的大小与xy 的大小不同(它短了一个元素,我不知道哪个元素被省略了)。其次,我确信可以在一行中做到这两点。

【问题讨论】:

【参考方案1】:

您不需要调用findisnan 两次,因为您通过第一个命令获得了下标。应用它们以获取 A 中的值:

[ii,jj] = find(~isnan(A));
z = A(sub2ind(size(A),ii,jj))

如果你反对sub2ind,可以使用ii+(jj-1)*size(A,1)

如果您以后不需要iijj,您可以通过A(~isnan(A)) 获得z(不需要find)。

【讨论】:

【参考方案2】:

您根本不需要第二个find,只需一点您已经在使用的逻辑索引:

% Example data
A = rand(5);
A(A>0.5) = NaN;

iA = ~isnan(A);
[x,y] = find(iA);
z = A(iA(:));

【讨论】:

谢谢,更笼统地说,您或@chappjc 知道为什么我的代码会给出不同的输出大小吗?我经常使用两者,我不想错过任何东西。 @Jigg:是的。在您第一次调用find 时,您输入了一个与A 相同大小/维度的数组。在对find 的第二次调用中,您已经对A 执行了一些逻辑索引,并且只传入了一个包含A 的非NaN 元素的列向量。如果您查看我的代码,您会发现z 正是您传递给第二个find 的内容。在许多情况下,逻辑索引就足够了,编辑器通常会建议 find 不是必需的。

以上是关于提取数组中非 NaN 元素的索引和值的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

如何获取numpy数组中所有NaN值的索引列表?

如何将熊猫系列转换为索引和值的元组

matlab数组中如何找某个值的坐标

pandas索引取数

swift 使用enumerate()访问数组元素的索引和值

matlab数组中如何找某个值的坐标