删除数据集中大于0的值

时间:2019-03-04 15:47:28

标签: python python-3.x list

我有一个数据集,它是一个列表列表,看起来像这样:

[[-0.519418066, -0.680905835],
[0.895518429, -0.654813183],
[0.092350219, 0.135117023],
[-0.299403315, -0.568458405],....]

其形状为(9760,),并且我尝试删除所有条目中每个条目中第一个数字的值大于0的所有条目,因此在本示例中,第2个和第3个条目将被删除以保留

[[-0.519418066, -0.680905835],
[-0.299403315, -0.568458405],....]

到目前为止,我已经写过:

for x in range(9670):
for j in filterfinal[j][0]:
    if filterfinal[j][0] > 0:
        np.delete(filterfinal[j])

这将返回:TypeError:列表索引必须是整数或切片,而不是列表

提前感谢您提供有关此问题的帮助!

5 个答案:

答案 0 :(得分:1)

您在谈论“形状”,因此我假设您使用的是numpy。另外,您在示例代码中提到了np,因此可以与element wise operations一起应用boolean indexing

array = np.array([[-0.519418066, -0.680905835],
                  [0.895518429, -0.654813183],
                  [0.092350219, 0.135117023],
                  [-0.299403315, -0.568458405]])

filtered = array[array[:, 0] < 0]

答案 1 :(得分:1)

您可以使用numpy的布尔索引:

>>> x = np.random.randn(10).reshape((5,2))
array([[-0.46490993,  0.09064271],
       [ 1.01982349, -0.46011639],
       [-0.40474591, -1.91849573],
       [-0.69098115,  0.19680831],
       [ 2.00139248, -1.94348869]])

>>> x[x[:,0] > 0]
array([[ 1.01982349, -0.46011639],
       [ 2.00139248, -1.94348869]])

一些解释:
x[:,0]选择数组的第一列。
x > 0将返回一个形状相同的数组,其中每个值都将被逐元素比较的结果替换(即值是否大于0?)
因此,根据行的第一个值,x[:,0] > 0将为您提供形状为(n,1)TrueFalse的形状数组。

然后,您可以将此布尔数组作为索引传递到原始数组,在原始数组中,它将返回仅包含True索引的数组。通过传入形状为(n,1)的布尔数组,可以选择每行。

答案 2 :(得分:0)

使用列表理解:

lol = [[-0.519418066, -0.680905835],[0.895518429, -0.654813183],[0.092350219, 0.135117023],[-0.299403315, -0.568458405]]

filtered_lol = [l for l in lol if l[0] <= 0]

答案 3 :(得分:0)

您可以使用列表推导功能,将每个子列表中的第一项拆包,并仅保留那些第一项<= 0的项(假设列表列表存储为变量l):

[l for a, _ in l if a <= 0]

答案 4 :(得分:0)

您可以在for循环中进行此操作,并制作一个没有正号的新列表,如下所示:

new_list = []
for item in old_list:
    if item[0] < 0:
        new_list.append(item)

但是我更喜欢使用内置的filter函数,如果您对此感到满意并执行以下操作:

def is_negative(number):
    return number < 0

filtered_list = filter(is_negative, old_list)

这类似于列表理解-或仅使用for循环。但是,它返回一个生成器,因此您不必在内存中保留两个列表,从而使代码更高效。