SORU
6 HAZİRAN 2013, PERŞEMBE


Numpy benzersiz satırları bulmak.dizi

numpy.array benzersiz satırları bulmak lazım.

Örneğin:

>>> a # I have
array([[1, 1, 1, 0, 0, 0],
       [0, 1, 1, 1, 0, 0],
       [0, 1, 1, 1, 0, 0],
       [1, 1, 1, 0, 0, 0],
       [1, 1, 1, 1, 1, 0]])
>>> new_a # I want to get to
array([[1, 1, 1, 0, 0, 0],
       [0, 1, 1, 1, 0, 0],
       [1, 1, 1, 1, 1, 0]])

Bir dizi oluşturma ve dizi üzerinde döngü biliyorum, ama numpy verimli saf bir çözüm arıyorum. Veri türü void için ayarlamak için bir yol var ve o zaman sadece numpy.unique, ben inanıyorum ama bu işi nasıl yapacağımı bulamadım.

CEVAP
6 HAZİRAN 2013, PERŞEMBE


Yapısal diziler kullanmak için başka bir seçenek, tek bir madde içine: bütün satır birleştiren void Bir tür bir görünüm kullanarak

a = np.array([[1, 1, 1, 0, 0, 0],
              [0, 1, 1, 1, 0, 0],
              [0, 1, 1, 1, 0, 0],
              [1, 1, 1, 0, 0, 0],
              [1, 1, 1, 1, 1, 0]])

b = np.ascontiguousarray(a).view(np.dtype((np.void, a.dtype.itemsize * a.shape[1])))
_, idx = np.unique(b, return_index=True)

unique_a = a[idx]

>>> unique_a
array([[0, 1, 1, 1, 0, 0],
       [1, 1, 1, 0, 0, 0],
       [1, 1, 1, 1, 1, 0]])

EDİT Eklendi np.ascontiguousarray @seberg tavsiyesi şu. Bu dizi zaten bitişik ise bu yöntem biraz yavaşlar.

EDİT Yukarıda biraz hızlandırdı, yaparak belki netlik pahasına, olabilir:

unique_a = np.unique(b).view(a.dtype).reshape(-1, a.shape[1])

Ayrıca, en azından benim sistemde, performans akıllıca eşit ya da daha iyisi, lexsort yöntemi daha

a = np.random.randint(2, size=(10000, 6))

%timeit np.unique(a.view(np.dtype((np.void, a.dtype.itemsize*a.shape[1])))).view(a.dtype).reshape(-1, a.shape[1])
100 loops, best of 3: 3.17 ms per loop

%timeit ind = np.lexsort(a.T); a[np.concatenate(([True],np.any(a[ind[1:]]!=a[ind[:-1]],axis=1)))]
100 loops, best of 3: 5.93 ms per loop

a = np.random.randint(2, size=(10000, 100))

%timeit np.unique(a.view(np.dtype((np.void, a.dtype.itemsize*a.shape[1])))).view(a.dtype).reshape(-1, a.shape[1])
10 loops, best of 3: 29.9 ms per loop

%timeit ind = np.lexsort(a.T); a[np.concatenate(([True],np.any(a[ind[1:]]!=a[ind[:-1]],axis=1)))]
10 loops, best of 3: 116 ms per loop

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • FrankJavCee

    FrankJavCee

    29 Kasım 2008
  • Jonathan Flavell

    Jonathan Fla

    1 HAZİRAN 2006
  • Troy Hunt

    Troy Hunt

    29 EYLÜL 2011