根据以前的值对Python列表进行二值化
我想根据以前的值对python列表" title="python列表">python列表进行二进制化,如果前一个值较低,则输出应为1,如果较高,则输出为0。例如:根据以前的值对Python列表进行二值化
[18985.0, 20491.0, 18554.0, 14241.0, 13390.0, 14965.0,] 应该变成:
[0, 1, 0, 0, 0, 1] 是否有任何优雅的方式来做到这一点? 在此先感谢!
回答:
一个列表理解应该工作。
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))]
您可能想要考虑两个值相等的情况。
回答:
您可以使用列表理解和zip函数来实现您想要的结果。我第一次硬编码值是0由于没有以前的值进行比较
>>> [0] + [1 if i<j else 0 for i,j in zip(l, l[1:])] >>> [0, 1, 0, 0, 0, 1]
回答:
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])。
回答:
使用inf作为第一个比较适当的默认值(它永远不会是<任意数),并用使用itertools.chain创建开始于inf然后让你在你的数据上一个项目适当的迭代器。这可能是不错的,简洁与map和operator模块,如果你不介意的话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]
回答:
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] 以上是 根据以前的值对Python列表进行二值化 的全部内容, 来源链接: utcz.com/qa/261539.html

