[英]Binarize a python list based on previous value
我想基於先前的值對python列表進行二值化,如果前一個值較低則輸出應為1,如果更高則輸出為0。 例:
[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]
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]
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)
需要插入來添加第一個元素,該元素始終為False。 陣列將是
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:])]
如果你不介意True和False(也是[0]
- > [False]
),甚至沒有int
。
使用inf
作為第一次比較的適當默認值(它永遠不會是<
任何數字),並使用itertools.chain
創建一個適當的迭代器,從inf
開始然后為您提供數據中的上一項。 如果您不介意bool
對象作為結果,這可以很好,簡潔地使用map
和operator
模塊:
>>> 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]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.