我的陣列是時間,所以它是排序和遞增的。
我必須拉出陣列中差異大于 30 的開頭/結尾。其他解決方案沒有涵蓋的問題是陣列是數千個值,因此遍歷陣列似乎效率低下。
hugeArr = np.array([0, 2.072, 50.0, 90.0, 91.1])
我對上述陣列的期望輸出類似于:(2.072,50) (50,90)。
有沒有辦法做到這一點?
uj5u.com熱心網友回復:
您可以使用np.diff和np.where找到正確的索引:
>>> idxs = np.where(np.diff(hugeArr) > 30)[0]
>>> list(zip(hugeArr[idxs], hugeArr[idxs 1]))
[(2.072, 50.0), (50.0, 90.0)]
(假設您只需要連續值)
正如@not_speshal 所提到的,您可以使用np.column_stack而不是list(zip(...))留在 NumPy 邊界內:
>>> np.column_stack((hugeArr[idxs], hugeArr[idxs 1]))
array([[ 2.072, 50. ],
[50. , 90. ]])
uj5u.com熱心網友回復:
試著想想你想要做什么。對于陣列中的每個值,如果下一個值大于 30,您希望保存它們的元組。
這里的關鍵詞是每個. 這是一個經典的O(n)復雜度演算法,所以降低它的時間復雜度對我來說似乎是不可能的。
但是,您可以對陣列進行特定的更改以使演算法更快。
例如,如果傻冒找的30的差異,你知道的平均差異為1,你可能會關閉在尋找更好index i的
difference = hugeArr[i 15] - hugeArr[i]
看看這是否大于 30。如果不是(并且可能不會),您可以跳過這 15 個索引,因為您知道兩個連續值之間的差距沒有大于大差距。
如果這對您有用,請運行測驗,15 是完全任意的,也許您的幻數是 25。稍微更改它并確定您的函式運行所需的時間。
uj5u.com熱心網友回復:
想到的一個策略是,我們不必檢查距離小于 30 的兩個數字之間的數字,我們可以這樣做,因為它是已排序的。例如,如果abs(hugeArr[0] - hugeArr[-1]) < 30我們不需要檢查任何東西,因為任何東西的距離都不會超過 30。
我們會從末端開始,然后向內作業。所以首先檢查起始號碼和結束號碼。然后,我們中途去hugeArr[len(hugeArr)//2]檢查這個數字距離對hugeArr[0]和hugeArr[-1]。然后我們進入范圍(hugeArr[0:len(hugeArr)//2]和hugeArr[len(hugeArr)//2:-1])。我們再次將這兩個范圍一分為二,只要端到端的距離小于 30,我們就不會檢查它們。我們可以使它成為一個遞回演算法。
最壞的情況是你到處都有超過 30 的距離,最終得到 O(n),但它可以給你一些優勢。
像這樣的東西,但是你可能想重構為 numpy。
def check(arr):
pairs = []
def check_range(hugeArr):
difference = abs(hugeArr[0] - hugeArr[-1])
if difference < 30:
return
if len(hugeArr) == 2:
pairs.append((hugeArr[0], hugeArr[1]))
return
halfway = len(hugeArr)//2
check_range(hugeArr[:halfway 1])
check_range(hugeArr[halfway:])
check_range(arr)
return pairs
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/315974.html
上一篇:處理嵌套陣列的回圈
