簡體   English   中英

根據以前的值對python列表進行二值化

[英]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對象作為結果,這可以很好,簡潔地使用mapoperator模塊:

>>> 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM