簡體   English   中英

如何計算 TRUE 的數量,直到 numpy 數組中的 FALSE?

[英]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.

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