根据以前的值对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