我有以下列格式過濾以智能方式
a = [[1,...,255],[1,...,255],...,[1,...,255]]
即包含固定長度的整數列表任意長度的列表列表的列表列表的列表255 (該值固定長度列表是來自「真實世界」的數據,而不是像本例中的整數1到255)。
現在,我想過濾掉所有內部列表(長度爲255)中的所有值,設置如果它們的值高於某個閾值,則將它們設置爲0
。
有沒有一個聰明的方式做到這一點,而不必寫兩個for循環?
我有以下列格式過濾以智能方式
a = [[1,...,255],[1,...,255],...,[1,...,255]]
即包含固定長度的整數列表任意長度的列表列表的列表列表的列表255 (該值固定長度列表是來自「真實世界」的數據,而不是像本例中的整數1到255)。
現在,我想過濾掉所有內部列表(長度爲255)中的所有值,設置如果它們的值高於某個閾值,則將它們設置爲0
。
有沒有一個聰明的方式做到這一點,而不必寫兩個for循環?
您可以使用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]])
變體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]
for循環的列表理解如何? –
@MattiLyra抱歉,不確定要理解你的問題。你的意思是,如果「for」循環,列表理解是隱含的? –
是的,列表理解是循環,它只是語法上更好。 http://docs.python.org/2/tutorial/datastructures.html#list-comprehensions –
# 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]
你能對你展開意思是「過濾掉」。是不是這樣,如果你發現嵌套列表中的某個值高於某個值,該子列表將被清零?或者它是內部列表的總和()。 – sotapme
他想將其設置爲零。 –