首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >比较两个数组值并删除行(如果条件已完全填充)

比较两个数组值并删除行(如果条件已完全填充)
EN

Stack Overflow用户
提问于 2022-11-04 09:31:38
回答 1查看 28关注 0票数 0

我有一个2列的数组。我想比较第一列的值,如下所示:

ai+1-ai<0.0025。

如果这是真的,我需要删除带有ai+1的行。

这是我的第一次尝试,但不起作用。

代码语言:javascript
复制
a = np.delete(a, np.diff(a[:,0])<0.0025, 0)

我得到以下错误:

ValueError:要删除的布尔数组参数obj必须是一维的,并匹配轴长8628。

8628是数组的长度。

我尝试过的另一个代码是:

代码语言:javascript
复制
a = a[~(np.diff(a[:,0]))<0.0025]

但是我得到了这个错误:

TypeError:对于输入类型不支持ufunc‘倒置’,并且根据“安全”规则不能安全地将输入强制到任何支持的类型。

有人能帮我吗?

EN

回答 1

Stack Overflow用户

发布于 2022-11-04 11:43:03

你走在正确的轨道上。np.diff(a[:, 0]) < 0.0025创建一个长度小于8628的数组,这意味着当您在np.delete中使用它时,维度不再与原始数组匹配。

我会同意你的第二次尝试。使用< 0.0025会导致要删除的项的掩码,需要使用~将其反转以获得希望保留的结果掩码。您必须确保正确地放置括号:~( np.diff(a[:, 0]) < 0.0025 )。相反,您也可以使用>= 0.0025来制作您想要保留的项的掩码。

最后,您必须确保匹配维度(考虑到np.diff导致的元素减少了一个)。您可以通过预先设置True来表示您始终希望保留第一个值。其中一种方法是使用np.r_

最终代码:

代码语言:javascript
复制
import numpy as np

a = np.random.rand(8628, 2) # Your array here

result = a[ np.r_[True, np.diff(a[:, 0]) >= 0.0025] ]

详细例子:

代码语言:javascript
复制
Consider the array:   [ 1,   3,    2,     5,     3]
np.diff creates:         [   2,    -1,    3,    -2]
Using threshold creates: [True, False, True, False]

注意,当原始数组中的下一个元素小于前一个元素时,阈值处理也会导致False。

最后,因为现在有4个值而不是5个值,所以我们将True放在前面。这样做的效果总是包括结果中的第一个元素:

代码语言:javascript
复制
Original: [   1,    3,     2,    5,     3]
Mask      [True, True, False, True, False]
           ^^^^  ~~~~  ~~~~~  ~~~~  ~~~~~

然后,使用布尔索引,获取掩码包含True的元素,以获得最终结果:

代码语言:javascript
复制
[1, 3, 5]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74314820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档