我有一個排序的非唯一數字的一維數組。他們重複的次數是隨機的。 它與具有相同大小的權重數組相關聯。對於給定的一系列相同的元素,相關的一系列權重可能也可能不具有重複的元素,並且在整個權重陣列中,可能有也可能不會有重複的元素。 E.g:Interval對於一個NumPy數組,其間隔由另一個數組定義的argmax
pos = np.array([3, 3, 7, 7, 9, 9, 9, 10, 10])
weights = np.array([2, 10, 20, 8, 5, 7, 15, 7, 2])
我需要提取的pos
獨特元件的陣列,但是其中唯一元件是一個具有最大權重。
我想出了一個工作的解決方案涉及循環:
pos = np.array([3, 3, 7, 7, 9, 9, 9, 10, 10])
weights = np.array([2, 10, 20, 8, 5, 7, 15, 7, 2])
# Get the number of occurences of the elements in pos but throw away the unique array, it's not the one I want.
_, ucounts = np.unique(pos, return_counts=True)
# Initialize the output array.
unique_pos_idx = np.zeros([ucounts.size], dtype=np.uint32)
last = 0
for i in range(ucounts.size):
maxpos = np.argmax(weights[last:last+ucounts[i]])
unique_pos_idx[i] = last + maxpos
last += ucounts[i]
# Result is:
# unique_pos_idx = [1 2 6 7]
,但我不使用太多的Python語言或numpy的(除了使用numpy的陣列),所以我不知道是否有一個更多Pythonesque和/或更高效的解決方案,甚至比以上的Cython版本更多?
感謝
非常感謝您@Divakar。我在你的回覆中學到了很多技巧。 在上面的代碼中,我應該考慮'np.flatnonzero(pos [1:]!= pos [: - 1])是否是一種在數組中定位唯一元素的替代方法?從我的角度來看,就好像我們拒絕了零導數的位置並保留其餘部分。我是否正確理解你將-1附加到它,考慮到這種分類方式使得最後一個元素必然是最重的元素? –
@ user31412'np.flatnonzero(pos [1:]!= pos [: - 1])基本上是通過切片一個切片得到間隔*改變的索引。我們需要這些,因爲我們打算得到每個組的最後一個,因爲lexsort/argsort會代表每個組/間隔的最大參數。最後-1是需要的,因爲切片會錯過獲取最後一組的最後一個元素。所以,我們手動添加。這給了我們最後一組的argmax,因爲sidx會把那個作爲最後一個元素。希望這是有道理的。 – Divakar
當然,這對我有意義。我要玩你提供的不同方法。非常感謝。只要我確信我能理解你寫的所有內容,我就會馬上接受這個答案。 –