Bir dizi tuple veya benzer bir veri yapısına dönüştürme bellek maliyetinden kaçınmak istiyorsanız, numpy'nin yapılandırılmış dizilerinden yararlanabilirsiniz.
Hile, orijinal dizinizi, her öğenin orijinal dizinin bir satırına karşılık geldiği yapılandırılmış bir dizi olarak görüntülemektir. Bu bir kopya oluşturmaz ve oldukça etkilidir.
Kısa bir örnek olarak:
import numpy as np
data = 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]])
ncols = data.shape[1]
dtype = data.dtype.descr * ncols
struct = data.view(dtype)
uniq = np.unique(struct)
uniq = uniq.view(data.dtype).reshape(-1, ncols)
print uniq
Neler olduğunu anlamak için aracı sonuçlara bir göz atın.
İşleri yapılandırılmış bir dizi olarak görüntüledikten sonra, dizideki her öğe orijinal dizinizdeki bir satırdır. (Temel olarak, tuples listesine benzer bir veri yapısıdır.)
In [71]: struct
Out[71]:
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)]],
dtype=[('f0', '<i8'), ('f1', '<i8'), ('f2', '<i8'), ('f3', '<i8'), ('f4', '<i8'), ('f5', '<i8')])
In [72]: struct[0]
Out[72]:
array([(1, 1, 1, 0, 0, 0)],
dtype=[('f0', '<i8'), ('f1', '<i8'), ('f2', '<i8'), ('f3', '<i8'), ('f4', '<i8'), ('f5', '<i8')])
Bir kez koştuğumuzda numpy.unique
, yapılandırılmış bir dizi geri alırız:
In [73]: np.unique(struct)
Out[73]:
array([(0, 1, 1, 1, 0, 0), (1, 1, 1, 0, 0, 0), (1, 1, 1, 1, 1, 0)],
dtype=[('f0', '<i8'), ('f1', '<i8'), ('f2', '<i8'), ('f3', '<i8'), ('f4', '<i8'), ('f5', '<i8')])
Daha sonra "normal" bir dizi olarak görüntülememiz gerektiğini ( _
son hesaplamanın sonucunu saklar ipython
, bu yüzden görüyorsunuz _.view...
):
In [74]: _.view(data.dtype)
Out[74]: array([0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0])
Ve sonra bir 2D diziye yeniden şekillendirin ( -1
numpy'ye doğru satır sayısını hesaplamasını söyleyen, sütun sayısını veren bir yer tutucudur):
In [75]: _.reshape(-1, ncols)
Out[75]:
array([[0, 1, 1, 1, 0, 0],
[1, 1, 1, 0, 0, 0],
[1, 1, 1, 1, 1, 0]])
Açıkçası, daha özlü olmak istiyorsanız, şöyle yazabilirsiniz:
import numpy as np
def unique_rows(data):
uniq = np.unique(data.view(data.dtype.descr * data.shape[1]))
return uniq.view(data.dtype).reshape(-1, data.shape[1])
data = 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]])
print unique_rows(data)
Sonuç:
[[0 1 1 1 0 0]
[1 1 1 0 0 0]
[1 1 1 1 1 0]]