নম্পি: 2 ডি অ্যারে থেকে এলোমেলোভাবে সারির সেট পান


160

আমার কাছে একটি খুব বড় 2 ডি অ্যারে রয়েছে যা দেখতে এরকম কিছু দেখাচ্ছে:

a=
[[a1, b1, c1],
 [a2, b2, c2],
 ...,
 [an, bn, cn]]

নম্পটি ব্যবহার করে, প্রাথমিক অ্যারে থেকে a( 2 টি প্রতিস্থাপন ব্যতীত) 2 টি এলোমেলো সারি সহ নতুন 2D অ্যারে পাওয়ার সহজ উপায় কি?

যেমন

b=
[[a4,  b4,  c4],
 [a99, b99, c99]]

8
প্রতিস্থাপনের জন্য একটি প্রশ্ন থাকা এবং এটি ছাড়াই এর নির্বুদ্ধিতা, আপনার কেবল উভয় উত্তরের অনুমতি দেওয়া উচিত এবং সত্যই উভয় উত্তরকে উত্সাহ দেওয়া উচিত।
পিনোকিও

উত্তর:


195
>>> A = np.random.randint(5, size=(10,3))
>>> A
array([[1, 3, 0],
       [3, 2, 0],
       [0, 2, 1],
       [1, 1, 4],
       [3, 2, 2],
       [0, 1, 0],
       [1, 3, 1],
       [0, 4, 1],
       [2, 4, 2],
       [3, 3, 1]])
>>> idx = np.random.randint(10, size=2)
>>> idx
array([7, 6])
>>> A[idx,:]
array([[0, 4, 1],
       [1, 3, 1]])

একটি সাধারণ ক্ষেত্রে এটি একসাথে রাখা:

A[np.random.randint(A.shape[0], size=2), :]

প্রতিস্থাপনের জন্য নয় (ন্যালি 1.7.0+):

A[np.random.choice(A.shape[0], 2, replace=False), :]

1.7 এর আগে প্রতিস্থাপন ছাড়াই এলোমেলো তালিকা তৈরি করার একটি ভাল উপায় আছে বলে আমি বিশ্বাস করি না। সম্ভবত আপনি একটি ছোট সংজ্ঞা সেটআপ করতে পারেন যা নিশ্চিত করে যে দুটি মান একই নয়।


4
খুব ভাল উপায় নাও হতে পারে, তবে একটি উপায় যা ঠিক ততটাই ভাল np.random.choiceএবং এটি হ'ল এটি np.random.permutation(A.shape[0])[:2]দুর্দান্ত নয় তবে np.random.choiceএই সময়ে যা ... বা যদি আপনি আপনার অ্যারে পরিবর্তন করতে চান না- স্থান,np.random.shuffle
সেবার্গ

1
Numpy 1.7 আগে, ব্যবহার র্যান্ডম .sample (xrange (10), 2)
ডেনিস

3
আপনি কেন আপনার ভেরিয়েবল এ এবং বি এবং স্টাফ নামকরণ করছেন? এটি পড়া কঠিন করে তোলে।
পিনোকিও

48

এটি একটি পুরানো পোস্ট, তবে এটি আমার পক্ষে সবচেয়ে ভাল কাজ করে:

A[np.random.choice(A.shape[0], num_rows_2_sample, replace=False)]

একই জিনিসটি পেতে, তবে প্রতিস্থাপনের সাথে প্রতিস্থাপন = মিথ্যাতে সত্যে পরিবর্তন করুন।


2
@ সালভাদোরডালি প্রতিস্থাপনের সাথে বেছে না নেওয়ার জন্য আমি হিজির পোস্ট সম্পাদনা করেছি। একবার সম্পাদন করা পাক্ষিক পর্যালোচনা করা হয়, এ জুড়েছে দেখতে পাবেন replace=Falseকরার PARAM choice
0x24a537r9

8
@ 0x24a537r9 আপনার এটি করা উচিত নয়। এটি তার উত্তর এবং আপনি এটি পরিবর্তন করুন। আপনি যদি চান - আপনার উত্তরটি যুক্ত করুন এমন কোনও লোকের উত্তর পরিবর্তন করবেন না যা উত্তর উল্লেখযোগ্যভাবে পরিবর্তিত করে
সালভাদোর ডালি

@ সালভাদোরডালি কেন নয়?
স্কট 18

25

অন্য বিকল্পটি হ'ল একটি র্যান্ডম মাস্ক তৈরি করা যদি আপনি কেবল কোনও নির্দিষ্ট ফ্যাক্টর দ্বারা আপনার ডেটা-নমুনা করতে চান। বলুন যে আমি আমার মূল ডেটা সেটটির 25% এ ডাউন-স্যাম্পল করতে চাই, যা বর্তমানে অ্যারেতে রাখা হয়েছে data_arr:

# generate random boolean mask the length of data
# use p 0.75 for False and 0.25 for True
mask = numpy.random.choice([False, True], len(data_arr), p=[0.75, 0.25])

এখন আপনি data_arr[mask]এলোমেলোভাবে নমুনাযুক্ত r 25% সারিগুলিতে কল করতে এবং ফিরে আসতে পারেন।


10

এটি হিজি রাশেফ প্রদত্ত একটির অনুরূপ উত্তর, তবে সরলীকৃত হয়েছে যাতে নতুন পাইথন ব্যবহারকারীরা কী চলছে তা বুঝতে পেরেছেন (আমি লক্ষ্য করেছি যে অনেক নতুন ডেটা বিজ্ঞানের শিক্ষার্থীরা অদ্ভুত উপায়ে এলোমেলোভাবে নমুনা নিয়ে আসে কারণ তারা অজগরটিতে কী করছে তা তারা জানে না)।

আপনি ব্যবহার করে আপনার অ্যারে থেকে প্রচুর এলোমেলো সূচক পেতে পারেন:

indices = np.random.choice(A.shape[0], amount_of_samples, replace=False)

তারপরে সেই সূচকগুলিতে নমুনাগুলি পেতে আপনি আপনার নাম্পার অ্যারে দিয়ে টুকরো টুকরো ব্যবহার করতে পারেন:

A[indices]

এটি আপনাকে আপনার ডেটা থেকে নির্দিষ্ট সংখ্যক এলোমেলো নমুনাগুলি পাবেন।


5

আমি দেখি যে অনুচ্ছেদটি প্রস্তাবিত হয়েছে। আসলে এটি এক লাইনে তৈরি করা যেতে পারে:

>>> A = np.random.randint(5, size=(10,3))
>>> np.random.permutation(A)[:2]

array([[0, 3, 0],
       [3, 1, 2]])

4

আপনার যদি একই সারিগুলির প্রয়োজন তবে কেবল একটি এলোমেলো নমুনার দরকার পরে,

import random
new_array = random.sample(old_array,x)

এখানে এক্স, আপনাকে 'এন্টি' হতে হবে যা আপনি এলোমেলোভাবে বেছে নিতে চান এমন সারিগুলির সংখ্যা নির্ধারণ করে।


4
এটি কেবল তখনই কাজ করে যদি old_arrayকোনও সিক্যুয়েন্স বা সেট হয়, কোনও নম্পি অ্যারে নয় [লিঙ্ক] ( ডকস.পিথথন.আর
লাইব্রেরি

2

আপনি যদি সারিগুলির একাধিক এলোমেলো উপসেট উত্পাদন করতে চান, উদাহরণস্বরূপ যদি আপনার আরএনএসএসি করছেন।

num_pop = 10
num_samples = 2
pop_in_sample = 3
rows_to_sample = np.random.random([num_pop, 5])
random_numbers = np.random.random([num_samples, num_pop])
samples = np.argsort(random_numbers, axis=1)[:, :pop_in_sample]
# will be shape [num_samples, pop_in_sample, 5]
row_subsets = rows_to_sample[samples, :]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.