মত পূর্ণসংখ্যার একটি অ্যারের দেওয়া
[1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5]
আমার কাছে এমন উপাদানগুলি মুখোশ করা দরকার যা N
বারের চেয়ে বেশি পুনরাবৃত্তি করে । স্পষ্ট করার জন্য: প্রাথমিক লক্ষ্য হ'ল বুলিয়ান মাস্ক অ্যারেটি পুনরুদ্ধার করা, এটি পরে বিনা গণনার জন্য ব্যবহার করা।
আমি বরং একটি জটিল সমাধান নিয়ে এসেছি
import numpy as np
bins = np.array([1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5])
N = 3
splits = np.split(bins, np.where(np.diff(bins) != 0)[0]+1)
mask = []
for s in splits:
if s.shape[0] <= N:
mask.append(np.ones(s.shape[0]).astype(np.bool_))
else:
mask.append(np.append(np.ones(N), np.zeros(s.shape[0]-N)).astype(np.bool_))
mask = np.concatenate(mask)
দান যেমন
bins[mask]
Out[90]: array([1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5])
এটি করার কোন সুন্দর উপায় আছে?
সম্পাদনা, # 2
উত্তরের জন্য অনেক ধন্যবাদ! এখানে এমসিফার্টের বেঞ্চমার্ক প্লটের একটি পাতলা সংস্করণ। আমাকে নির্দেশ করার জন্য ধন্যবাদ simple_benchmark
। কেবলমাত্র দ্রুততম 4 টি বিকল্প দেখাচ্ছে:
উপসংহার
ফ্লোরিয়ান এইচ প্রস্তাবিত , পল পাঞ্জার দ্বারা সংশোধিত এই সমস্যাটি সমাধানের এক দুর্দান্ত উপায় বলে মনে হচ্ছে এটি পুরোপুরি সোজা এবং numpy
একা হয়ে গেছে। আপনি যদি ব্যবহার করে ঠিক থাকেন numba
তবে এমসিফের্টের সমাধান ছাড়িয়ে যায়।
আমি এমসিফার্টের উত্তরটিকে আরও সাধারণ উত্তর হিসাবে সমাধান হিসাবে গ্রহণ করতে বেছে নিয়েছি: এটি ক্রমাগত পুনরাবৃত্তিকারী উপাদানগুলির (অ-অনন্য) ব্লকের সাথে স্বেচ্ছাসেবী অ্যারেগুলি সঠিকভাবে পরিচালনা করে। যদি না যায় numba
তবে দিবাকরের উত্তরটিও দেখার মতো!