[英]How to find longest consecutive ocurrence of non-zero elements in 2D numpy array
[英]How to find the longest consecutive non-zero subset of a list?
我有一個看起來像這樣的浮動列表:
[
163.33333333333334,
0.0,
0.0,
154.73684210526315,
172.94117647058823,
155.8303886925795,
0.0,
156.93950177935943,
0.0,
0.0,
0.0,
151.5463917525773,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
165.1685393258427,
156.93950177935943,
169.6153846153846,
159.7826086956522,
167.04545454545453,
158.06451612903226,
168.9655172413793,
157.5,
0.0,
159.7826086956522,
0.0,
163.94052044609666,
166.41509433962264,
0.0,
0.0,
0.0,
]
實際列表比這大得多,但具有相似的值。 從這個列表中,我想找到這個非零的最大連續子集。 在這種情況下,這將是:
[165.1685393258427,
156.93950177935943,
169.6153846153846,
159.7826086956522,
167.04545454545453,
158.06451612903226,
168.9655172413793]
我是 python 和 python 和一般編碼的新手,所以任何幫助將不勝感激。
您可以使用帶緩沖區的簡單算法
做一個for循環,然后獲取當前子集,然后如果當前子集的長度大於最大值,則設置為最大值。
def get_longest_consecutive_non_zero_subset(input_list: list) -> list:
max_subset = []
current_max_subset = []
for number in input_list:
if number > 0:
current_max_subset.append(number)
else:
if len(current_max_subset) > len(max_subset):
max_subset = current_max_subset
current_max_subset = []
return max_subset
test_list = [0, 1, 2, 3, 0, 0, 1, 2, 3, 4, 0]
result = get_longest_consecutive_non_zero_subset(test_list)
print(result)
assert result == [1, 2, 3, 4]
您可以使用itertools.groupby
,對值是否為 0 進行分組,然后 select 所有具有非零值的子列表並找到具有最大長度的子列表:
from itertools import groupby
g = groupby(l, key=lambda x:x>0.0)
m = max([list(s) for v, s in g if v > 0.0], key=len)
print(m)
Output(用於您的示例數據):
[
165.1685393258427,
156.93950177935943,
169.6153846153846,
159.7826086956522,
167.04545454545453,
158.06451612903226,
168.9655172413793,
157.5
]
請注意,由於您只需要與0
進行比較,因此您可以只使用bool
作為groupby
function (即g = groupby(l, bool)
)。 這應該比與0
相比更快。
您可以利用groupby()
處理未排序數據的方式:
from itertools import groupby
lst = [163.33333333333334, 0.0, 0.0, 154.73684210526315, 172.94117647058823, 155.8303886925795, 0.0, 156.93950177935943, 0.0, 0.0, 0.0, 151.5463917525773, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 165.1685393258427, 156.93950177935943, 169.6153846153846, 159.7826086956522, 167.04545454545453, 158.06451612903226, 168.9655172413793, 157.5, 0.0, 159.7826086956522, 0.0, 163.94052044609666, 166.41509433962264, 0.0, 0.0, 0.0]
result = max((list(g) for k, g in groupby(lst, bool) if k), key=len)
def max_non_zero_subset(arr):
max_non_zero = []
curr_non_zero = []
for n in arr:
if n == 0:
if len(curr_non_zero) > len(max_non_zero):
max_non_zero = curr_non_zero
curr_non_zero = []
else:
curr_non_zero.append(n)
return max_non_zero if len(max_non_zero) >= len(curr_non_zero) else curr_non_zero
您可以嘗試使用一些 if 語句。 因此,您說您是 python 的新手,我更喜歡讓代碼盡可能簡單,但優化它會是一個很好的“培訓”
fulllist = [163.33333333333334, 0.0, 0.0, 154.73684210526315, 172.94117647058823, 155.8303886925795, 0.0, 156.93950177935943, 0.0, 0.0, 0.0, 151.5463917525773, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 165.1685393258427, 156.93950177935943, 169.6153846153846, 159.7826086956522, 167.04545454545453, 158.06451612903226, 168.9655172413793, 157.5, 0.0, 159.7826086956522, 0.0, 163.94052044609666, 166.41509433962264, 0.0, 0.0, 0.0,]
longest = []
new_try = []
for element in fulllist:
if element != 0:
new_try.append(element)
if new_try>longest:
longest = new_try.copy()
if element == 0:
new_try = []
print(longest)
Output:
[165.1685393258427, 156.93950177935943, 169.6153846153846, 159.7826086956522, 167.04545454545453, 158.06451612903226, 168.9655172413793, 157.5]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.