[英]How to count number of False values that precede at least one True with Numpy array?
[英]How to count the number of TRUE until a FALSE in numpy array?
我正在嘗試計算numpy.array
中 True 值的數量,直到達到 False 為止。
例如,如果你有
condition = np.array([True, True, True, False,
False, True, False, True, True, False, True])
那么想要的結果就是
np.array([3, 2, 1, 0, 0, 1, 0, 2, 1, 0, 1])
編輯:
Numpy 第一次出現大於現有值的值不是我要問的,因為這是關於第一次滿足條件的問題。 我問的是每次滿足條件時連續多少次滿足。 查找與條件匹配的第一個序列項也不起作用,因為同樣,我不是在詢問序列第一次滿足條件的時間。
condition = np.array([True, True, True, False,
False, True, False, True, True, False, True])
r = []
c = 0
for x in reversed(condition):
if x == False:
c = 0
else:
c+=1
r.append(c)
r.reverse()
print(np.array(r))
https://trinket.io/python3/a5bd54189b
較短的版本:
r = [0]
for x in reversed(condition):
r.append(r[-1] + 1 if x else 0)
r.reverse()
r.pop()
print(np.array(r))
逐行解釋計算
import numpy as np
condition = np.array([True, True, True, False, False, True, False, True, True, False, True])
rvs = condition[::-1] # Reverse the array order
rvs
# array([ True, False, True, True, False, True, False, False, True,
True, True])
cum_rvs = rvs.cumsum() # Cumulative sum of Trues
cum_at_zero = (~rvs)*cum_rvs # Cum where rvs is True set to zero
cum_max = np.maximum.accumulate( cum_at_zero ) # Equivalent to cummax( cum_at_zero )
cum_max
# array([0, 1, 1, 1, 3, 3, 4, 4, 4, 4, 4])
result = cum_rvs - cum_max # Use cum_max to adjust the cum_rvs down
result = result[::-1] # Reverse the result order
result
# array([3, 2, 1, 0, 0, 1, 0, 2, 1, 0, 1])
或者更簡潔的形式:
rvs = condition[::-1]
cum_rvs = rvs.cumsum()
result = ( cum_rvs - np.maximum.accumulate((~rvs)*cum_rvs ))[::-1]
import itertools
condition = np.array([True, True, True, False, False, True, False, True, True, False, True])
group_list = [list(g) for _, g in itertools.groupby(enumerate(condition), key = lambda x: x[-1])]
temp = 0
ans = []
for item in group_list:
if item[0][1]:
for i in range(len(item)):
ans.append(len(item) - (item[i][0] - temp))
temp += len(item)
else:
for i in range(len(item)):
ans.append(0)
temp += len(item)
print(ans)
>>> [3, 2, 1, 0, 0, 1, 0, 2, 1, 0, 1]
您實際上可以使用兩行代碼全面完成此操作,而無需 ext 庫:
false_indices = [np.where(condition[j:] == False)[0] for j in range(len(condition))]
result = np.array([arr[0] if arr.size != 0 else int(condition[-1]) for arr in result])
如果不是在會引發IndexError
conditions
的最后一個 bool ,它甚至可能是單行的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.