यदि आप टुपल्स या इसी तरह की अन्य डेटा संरचना की श्रृंखला में परिवर्तित होने के स्मृति व्यय से बचना चाहते हैं, तो आप सुपी की संरचित सरणियों का उपयोग कर सकते हैं।
चाल आपके मूल सरणी को एक संरचित सरणी के रूप में देखने के लिए है जहां प्रत्येक आइटम मूल सरणी की एक पंक्ति से मेल खाती है। यह एक प्रतिलिपि नहीं बनाता है, और काफी कुशल है।
एक त्वरित उदाहरण के रूप में:
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
क्या चल रहा है, यह समझने के लिए, मध्यस्थ परिणामों पर एक नज़र डालें।
एक बार जब हम चीजों को एक संरचित सरणी के रूप में देखते हैं, तो सरणी में प्रत्येक तत्व आपके मूल सरणी में एक पंक्ति है। (मूल रूप से, यह टुपल्स की सूची के समान डेटा संरचना है।)
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')])
एक बार जब हम दौड़ेंगे numpy.unique
, तो हमें एक संरचित सरणी मिलेगी:
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')])
फिर हमें "सामान्य" सरणी के रूप में देखने की आवश्यकता है ( _
अंतिम गणना के परिणाम को संग्रहीत करता है ipython
, जिसके कारण आप देख रहे हैं _.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])
और फिर एक 2 डी सरणी में पुनः आकार दें ( -1
एक प्लेसहोल्डर है जो पंक्तियों की सही संख्या की गणना करने के लिए सुन्न बताता है, स्तंभों की संख्या दें):
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]])
जाहिर है, यदि आप अधिक संक्षिप्त होना चाहते हैं, तो आप इसे इस प्रकार लिख सकते हैं:
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)
जिसके परिणामस्वरूप:
[[0 1 1 1 0 0]
[1 1 1 0 0 0]
[1 1 1 1 1 0]]