我有一个2列的数组。我想比较第一列的值,如下所示:
ai+1-ai<0.0025。
如果这是真的,我需要删除带有ai+1的行。
这是我的第一次尝试,但不起作用。
a = np.delete(a, np.diff(a[:,0])<0.0025, 0)我得到以下错误:
ValueError:要删除的布尔数组参数obj必须是一维的,并匹配轴长8628。
8628是数组的长度。
我尝试过的另一个代码是:
a = a[~(np.diff(a[:,0]))<0.0025]但是我得到了这个错误:
TypeError:对于输入类型不支持ufunc‘倒置’,并且根据“安全”规则不能安全地将输入强制到任何支持的类型。
有人能帮我吗?
发布于 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_。
最终代码:
import numpy as np
a = np.random.rand(8628, 2) # Your array here
result = a[ np.r_[True, np.diff(a[:, 0]) >= 0.0025] ]详细例子:
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放在前面。这样做的效果总是包括结果中的第一个元素:
Original: [ 1, 3, 2, 5, 3]
Mask [True, True, False, True, False]
^^^^ ~~~~ ~~~~~ ~~~~ ~~~~~然后,使用布尔索引,获取掩码包含True的元素,以获得最终结果:
[1, 3, 5]https://stackoverflow.com/questions/74314820
复制相似问题