不幸的是,沒有一種簡單的方法可以做到這一點。使用np.unique
答案。此方法要求您要唯一的軸在內存中連續,numpy的典型內存佈局爲行中連續或連續的C
。幸運的numpy的,使這種轉換很簡單:
A = np.array([[1, 1, 1, 0, 1, 1],
[1, 2, 2, 0, 1, 2],
[1, 3, 3, 0, 1, 3]])
def unique_columns2(data):
dt = np.dtype((np.void, data.dtype.itemsize * data.shape[0]))
dataf = np.asfortranarray(data).view(dt)
u,uind = np.unique(dataf, return_inverse=True)
u = u.view(data.dtype).reshape(-1,data.shape[0]).T
return (u,uind)
我們的結果是:
u,uind = unique_columns2(A)
u
array([[0, 1, 1],
[0, 1, 2],
[0, 1, 3]])
uind
array([1, 2, 2, 0, 1, 2])
我真的不知道你想從這裏做什麼,比如你可以這樣做:
>>> [np.where(uind==x)[0] for x in range(u.shape[0])]
[array([3]), array([0, 4]), array([1, 2, 5])]
一些計時:
tmp = np.random.randint(0,4,(30000,500))
#BiRico and OP's answer
%timeit unique_columns(tmp)
1 loops, best of 3: 2.91 s per loop
%timeit unique_columns2(tmp)
1 loops, best of 3: 208 ms per loop
你需要numpy的性能,還是純粹的python實現行嗎? – wim
你近了,你已經找到了所有獨特的列。每個真值都是新組開始的位置。 'ind'擁有你想要的所有指數,但通過indexing ind你只需要一個值而不是全部。嘗試在連續Tru之間的'ind'中獲取所有值。 –
謝謝你們。我認爲這樣做。我是Python新手;來自C++的老學校,我覺得在Python中處理索引是不自然的。我用numpy是因爲我的數組非常大[300000,1000] – user3329302