2017-12-18 203 views
3

我想根据以前的值对python列表进行二进制化,如果前一个值较低,则输出应为1,如果较高,则输出为0。例如:根据以前的值对Python列表进行二值化

[18985.0, 20491.0, 18554.0, 14241.0, 13390.0, 14965.0,] 

应该变成:

[0, 1, 0, 0, 0, 1] 

是否有任何优雅的方式来做到这一点? 在此先感谢!

回答

2

一个列表理解应该工作。

A = [18985.0, 20491.0, 18554.0, 14241.0, 13390.0, 14965.0] 
A = [0] + [1 if A[i] > A[i-1] else 0 for i in range(1, len(A))] 

您可能想要考虑两个值相等的情况。

1

您可以使用列表理解和zip函数来实现您想要的结果。我第一次硬编码值是0由于没有以前的值进行比较

>>> [0] + [1 if i<j else 0 for i,j in zip(l, l[1:])] 
>>> [0, 1, 0, 0, 0, 1] 
0

numpy的解决方案:需要

import numpy as np 
a=array([18985.0, 20491.0, 18554.0, 14241.0, 13390.0, 14965.0]) 
np.insert(a[1:]>a[:-1],0,False) 
array([False, True, False, False, False, True], dtype=bool) 

插入添加的第一元素,这始终是假。阵列将是

array([True, False, False, False, True], dtype=bool) 

没有它。如果你想整数,而不是布尔值(即0.1)使用

np.insert(a[1:]>a[:-1],0,False).astype(int) 

你还可以缩短的东西上面的解决方案,如

[0] + [int(i<j) for i,j in zip(l, l[1:])] 

甚至没有int,如果你不介意的话真和False(也是[0] - >[False])。

0

使用inf作为第一个比较适当的默认值(它永远不会是<任意数),并用使用itertools.chain创建开始于inf然后让你在你的数据上一个项目适当的迭代器。这可能是不错的,简洁与mapoperator模块,如果你不介意的话bool对象作为你的结果:

>>> from itertools import chain 
>>> inf = float('inf') 
>>> import operator as op 
>>> list(map(op.lt, data, chain((inf,), data))) 
[True, False, True, True, True, False] 

这可以用zip以及一个列表理解来完成,但是,它开始得到笨拙:

>>> [prev < curr for curr, prev in zip(data, chain((inf,), data))] 
[False, True, False, False, False, True] 

但它可以让更多的方便转换为int

>>> [int(prev < curr) for curr, prev in zip(data, chain((inf,), data))] 
[0, 1, 0, 0, 0, 1] 
1

map溶液:

vals = [18985.0, 20491.0, 18554.0, 14241.0, 13390.0, 14965.0] 
map(
    lambda (ind, x): 
    1 if vals[ind] > vals[ind - 1] and ind != 0 else 0, 
    enumerate(vals) 
) 

输出:

[0, 1, 0, 0, 0, 1] 
相关问题