我有一个数据集,它是一个列表列表,看起来像这样:
[[-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:列表索引必须是整数或切片,而不是列表
提前感谢您提供有关此问题的帮助!
答案 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)
或True
或False
的形状数组。
然后,您可以将此布尔数组作为索引传递到原始数组,在原始数组中,它将返回仅包含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循环。但是,它返回一个生成器,因此您不必在内存中保留两个列表,从而使代码更高效。