2013-02-01 63 views
0

我有以下列格式过滤以智能方式

a = [[1,...,255],[1,...,255],...,[1,...,255]] 

即包含固定长度的整数列表任意长度的列表列表的列表列表的列表255 (该值固定长度列表是来自“真实世界”的数据,而不是像本例中的整数1到255)。

现在,我想过滤掉所有内部列表(长度为255)中的所有值,设置如果它们的值高于某个阈值,则将它们设置为0

有没有一个聪明的方式做到这一点,而不必写两个for循环?

+1

你能对你展开意思是“过滤掉”。是不是这样,如果你发现嵌套列表中的某个值高于某个值,该子列表将被清零?或者它是内部列表的总和()。 – sotapme

+0

他想将其设置为零。 –

回答

4

您可以使用numpy要做到这一点很容易:

import numpy as np 

a = [range(255) for _ in range(10)] 
np_a = np.array(a)  
# set all values above 200 to 0 
np_a[np_a > 200] = 0 
# np_a now contains the data with all values above 200 changed to 0 

# if you needed to convert the numpy array back to a python list 
a = np_a.tolist() 

输出,以显示它的工作。

In [209]: np_a 
Out[209]: 
array([[ 0, 1, 2, ..., 252, 253, 254], 
     [ 0, 1, 2, ..., 252, 253, 254], 
     [ 0, 1, 2, ..., 252, 253, 254], 
     ..., 
     [ 0, 1, 2, ..., 252, 253, 254], 
     [ 0, 1, 2, ..., 252, 253, 254], 
     [ 0, 1, 2, ..., 252, 253, 254]]) 

In [210]: np_a[np_a > 252] = 0 

In [211]: np_a 
Out[211]: 
array([[ 0, 1, 2, ..., 252, 0, 0], 
     [ 0, 1, 2, ..., 252, 0, 0], 
     [ 0, 1, 2, ..., 252, 0, 0], 
     ..., 
     [ 0, 1, 2, ..., 252, 0, 0], 
     [ 0, 1, 2, ..., 252, 0, 0], 
     [ 0, 1, 2, ..., 252, 0, 0]]) 
+0

我刚刚尝试过,但'npa'未定义。我有兴趣看到结果。 – sotapme

+0

@sotapme - 它是一个错字,尝试用'np_a' – root

+0

好的解决方案。这就是你想要的。 – sotapme

0

变体1:只有1 for,例如:

dst = [] 
for s in src: 
    dst.append([x if x < 3 else 0 for x in s]) 

变2:没有明确for

filter = lambda lst: [x if x < 3 else 0 for x in lst] 
dst = [filter(x) for x in src] 
+0

for循环的列表理解如何? –

+0

@MattiLyra抱歉,不确定要理解你的问题。你的意思是,如果“for”循环,列表理解是隐含的? –

+0

是的,列表理解是循环,它只是语法上更好。 http://docs.python.org/2/tutorial/datastructures.html#list-comprehensions –

0
# arbitarry length list of 255 length lists.  
l = [range(255)]*3 # 3 inner lists (as example) 

# get filtered results: 
f = [[k if k > 5 else 0 for k in j] for j in l] # filter at value 5 (as example) 

# as a function: 
def filter(lst, num): 
    return [[k if k > num else 0 for k in j] for j in lst] 

# as an iter over inner lists. 
def filter(lst, num): 
    for j in lst: 
     yield [k if k > num else 0 for k in j]