我有一個排序的數字串列:
[ 1, 2, 3, 4, 6, 7, 8, 9, 14, 15, 16, 17, 18, 25,
26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 38, 45]
我想知道 numpy 是否有一個內置功能可以從中獲得類似的東西:
[ [1, 4], [6, 9], [14, 18], [25,36], [38], [45] ]
如果它可以忽略介于兩者之間的某些 2-3 個數字的空洞仍然會構成范圍,那也很棒。
我基本上是在列出要處理的視頻的幀號 - 因此,與其列出所有幀號,我會在范圍內添加,如果中間缺少 3-4 幀也沒關系。
只是想知道是否有一些東西已經實作了這個邏輯,因為這似乎是人們想要做的常見事情——否則,我將自己實作它。
編輯: 發現了一個已經回答的非常接近的問題: 在 python 中將整數串列轉換為范圍
uj5u.com熱心網友回復:
由于它被標記為 numpy,這里是一個 numpy 解決方案(有點)。沒有本機 numpy 函式,但您可以使用diff 串列理解where:split
>>> [[ary[0], ary[-1]] if len(ary)>1 else [ary[0]] for ary in np.split(arr, np.where(np.diff(arr) != 1)[0] 1)]
[[1, 4], [6, 9], [14, 18], [25, 36], [38], [45]]
如果陣列很大,使用回圈而不是更有效np.split,因此您可以使用下面的函式產生與上面相同的結果:
def array_to_range(arr):
idx = np.r_[0, np.where(np.diff(arr) != 1)[0] 1, len(arr)]
out = []
for i,j in zip(idx, idx[1:]):
ary = arr[i:j]
if len(ary) > 1:
out.append([ary[0], ary[-1]])
else:
out.append([ary[0]])
return out
uj5u.com熱心網友回復:
numpy不適用于處理大小不同的陣列。它在內部list.append使用切片將多個串列附加到空陣列。它確實減慢了速度,建議僅在用戶被迫使用的情況下使用。
的演算法np.split
為了更好地了解,您如何改進,讓我們看一下np.splitfind -like 陣列拆分索引的一般模式:
arr = [1, 2, 3, 4, 6, 7, 8, 9, 14, 15, 16, 17, 18, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 38, 45]
div_points = np.flatnonzero(np.diff(arr)!=1) 1
start_points = np.r_[0, div_points]
end_points = np.r_[div_points, len(arr)]
所以現在你已經有了將陣列拆分為多個子陣列的切片的開始和結束引數:
np.transpose([start_points, end_points])
>>> array([[ 0, 4],
[ 4, 8],
[ 8, 13],
[13, 25],
[25, 26],
[26, 27]])
還有一種機制可以在np.split內部使用來拆分陣列:
container = []
for start, end in np.transpose([start_points, end_points]):
container.append(arr[start:end])
>>> container
[[1, 2, 3, 4],
[6, 7, 8, 9],
[14, 15, 16, 17, 18],
[25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36],
[38],
[45]]
演算法的變化
要獲得與您期望的幾乎相似的輸出,您可以np.split像這樣修改演算法:
div_points = np.flatnonzero(np.diff(arr)!=1) 1
start_points = np.r_[0, div_points]
end_points = np.r_[div_points, len(arr)]
out = np.transpose([arr[start_points], arr[end_points - 1]])
out
>>> array([[ 1, 4],
[ 6, 9],
[14, 18],
[25, 36],
[38, 38],
[45, 45]])
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/427459.html
標籤:Python 数组 python-3.x 列表 麻木的
上一篇:戲說領域驅動設計(五)——子域
下一篇:戲說領域驅動設計(五)——子域
