Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于函数从列表中删除项目_Python_Numpy - Fatal编程技术网

Python 基于函数从列表中删除项目

Python 基于函数从列表中删除项目,python,numpy,Python,Numpy,基于python中的函数(以及任何公共库)从列表中删除项的最有效方法是什么 例如,如果我有以下功能: def func(a): return a % 2 == 1 filtered_arr = filter(func, arr) 以及下列名单: arr = [1,4,5,8,20,24] 那么我想要的结果是: new_arr = [1,5] 我知道我可以像这样简单地迭代列表: new_arr = [i for i in arr if func(a)] 只是想知道这是否是一种有效

基于python中的函数(以及任何公共库)从列表中删除项的最有效方法是什么

例如,如果我有以下功能:

def func(a):
    return a % 2 == 1
filtered_arr = filter(func, arr)
以及下列名单:

arr = [1,4,5,8,20,24]
那么我想要的结果是:

new_arr = [1,5]
我知道我可以像这样简单地迭代列表:

new_arr = [i for i in arr if func(a)]
只是想知道这是否是一种有效的方法(对于大型数据集),或者是否有更好的方法。我在想也许可以使用np映射并更改函数以返回if True和-1 if false,然后使用np remove删除所有0

编辑: 我决定用你们所有人给出的建议自己测试它(我可能只是应该自己测试运行时,而不是懒惰和询问其他人)

filter
是迄今为止速度最快的。虽然如果您需要一个随机访问列表,它可以与
[i for i in arr if func(i)]
方法相比较


numpy
[np.vectorize(func)(arr)]
比其他列表方法稍快。

这是内置函数的用例:

def func(a):
    return a % 2 == 1
filtered_arr = filter(func, arr)
请注意,这将返回一个迭代器,而不是列表。如果你想要一个列表,你可以创建一个带有
list(filtered\u arr)
的列表,或者你提到的列表理解。但是,如果您只想迭代过滤的项,而不需要随机访问/索引,那么使用迭代器会更节省内存


这是一种很好的通用方法,用于筛选不太大且包含任意(可能是混合)类型元素的列表。如果要处理大量数值数据,则应使用其他答案中提到的NumPy解决方案之一。

既然NumPy标记存在,就使用它吧。在本例中,我们对元素使用掩码,当元素除以2时,余数为1

>>> import numpy as np
>>>
>>> arr = np.array([1,4,5,8,20,24])
>>> arr
array([ 1,  4,  5,  8, 20, 24])
>>> arr[arr % 2 == 1]
array([1, 5])

使用numpy,您可以使用
numpy.vectorize
在数组元素之间映射函数,然后使用该映射将计算结果保持为
True
。从你的函数开始

def func(a):
    return a % 2 == 1
我们可以测试只保留[0,19]范围内的奇数值

>>> import numpy as np
>>> arr = np.arange(20)
>>> arr
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19])
>>> np.vectorize(func)(arr)
array([False,  True, False,  True, False,  True, False,  True, False, True, False,  True, False,  True, False,  True, False,  True, False,  True])
>>> arr[np.vectorize(func)(arr)]
array([ 1,  3,  5,  7,  9, 11, 13, 15, 17, 19])

您还可以重写
func
,使其以列表作为参数:

def func(lst):
    lst = [x for x in lst if x % 2 == 1]
    return lst
然后做:

new_arr = func(arr)

这将为您节省一些行,而不是每次您想在列表的(元素)上使用它时,让
func
以单个数字作为参数并编写一个迭代,例如
[for i in arr if func(a)]
(我可能应该自己测试运行时,而不是懒散地问别人)

filter
是目前为止速度最快的一种方法。尽管如果您需要一个随机访问列表,它可以与
[i for i in arr if func(i)]
方法相媲美

numpy
[np.vectorize(func)(arr)]
比其他方法稍快


我只是想发布此消息,以防将来有人遇到此问题。

您需要再次将其转换为列表:
list(filter(func,arr))
@aminnd请参阅我的编辑,您应该只在实际需要时创建一个列表。“这是一种有效的方法吗?”这是一个只有您才能做出的值判断。因为您还不知道,所以对于堆栈溢出,您没有一个很好的问题。您知道其他方法--测试它们。使用
定时器
。这几乎就像在您发表此评论之前我就已经对此做出了回答。我现在看到您已经回答了。对该问题至关重要的信息属于问题。就目前的情况来看,您只讨论了一个在其他地方处理得相当彻底的主题。