আপনি যদি ধারাবাহিক টিপলস বা অন্য কোনও অনুরূপ ডেটা স্ট্রাকচারে রূপান্তরকরণের মেমরির ব্যয়টি এড়াতে চান, তবে আপনি নম্পির কাঠামোগত অ্যারেগুলি ব্যবহার করতে পারেন।
কৌশলটি হ'ল আপনার আসল অ্যারেটিকে একটি কাঠামোগত অ্যারে হিসাবে দেখতে হবে যেখানে প্রতিটি আইটেম মূল অ্যারের একটি সারির সাথে সম্পর্কিত। এটি কোনও অনুলিপি তৈরি করে না এবং এটি বেশ দক্ষ।
দ্রুত উদাহরণ হিসাবে:
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])
এবং তারপরে একটি 2D অ্যারে পুনরায় আকার দিন ( -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]]