我需要找到重複的2D numpy的陣列。因此,我想要一個與輸入相同長度的列表,指向相應值的第一次出現。例如,數組[[1,0,0],[1,0,0],[2,3,4]]具有兩個相等的元素0和1.該方法應返回[0,0,2](請參閱下面的代碼中的例子)。 以下代碼正在運行,但對於大型陣列來說速度很慢。蟒蛇numpy的加快2D重複的搜索
import numpy as np
def duplicates(ar):
"""
Args:
ar (array_like): array
Returns:
list of int: int is pointing to first occurence of unique value
"""
# duplicates array:
dup = np.full(ar.shape[0], -1, dtype=int)
for i in range(ar.shape[0]):
if dup[i] != -1:
# i is already found to be a
continue
else:
dup[i] = i
for j in range(i + 1, ar.shape[0]):
if (ar[i] == ar[j]).all():
dup[j] = i
return dup
if __name__ == '__main__':
n = 100
# shortest extreme for n points
a1 = np.array([[0, 1, 2]] * n)
assert (duplicates(a1) == np.full(n, 0)).all(), True
# longest extreme for n points
a2 = np.linspace(0, 1, n * 3).reshape((n, 3))
assert (duplicates(a2) == np.arange(0, n)).all(), True
# test case
a3 = np.array([[1, 0, 0], [1, 0, 0], [2, 3, 4]])
assert (duplicates(a3) == [0, 0, 2]).all(), True
任何想法如何加快過程(例如避免第二個循環)或替代實現? 乾杯
矢量化方法似乎有特殊情況的問題(見我的答覆編輯) –
@DanielBöckenhoff燁是一個很小的錯誤。應該是'.any'而不是'.all'。剛剛修好。這不應該改變時機。 – Divakar