Numpy: 2D सरणी से पंक्तियों का यादृच्छिक सेट प्राप्त करें


160

मेरे पास एक बहुत बड़ा 2D सरणी है जो कुछ इस तरह दिखता है:

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

Numpy का उपयोग करना, क्या एक नया 2D सरणी प्राप्त करने का एक आसान तरीका है, उदाहरण के लिए, प्रारंभिक सरणी a(प्रतिस्थापन के बिना) से 2 यादृच्छिक पंक्तियाँ ?

जैसे

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), :]

गैर प्रतिस्थापन के लिए (numpy 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
17

1
सुन्न 1.7 से पहले, यादृच्छिक का उपयोग करें। नमूना (xrange (10), 2)
डेनिस

3
आप अपने चर A और B और सामान का नामकरण क्यों कर रहे हैं? यह पढ़ने के लिए कठिन बनाता है।
पिनोचियो

48

यह एक पुरानी पोस्ट है, लेकिन यह मेरे लिए सबसे अच्छा काम करता है:

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

एक ही चीज़ पाने के लिए बदलें = गलत को बदल दें, लेकिन प्रतिस्थापन के साथ।


2
@SalvadorDali मैंने प्रतिस्थापन के साथ चयन नहीं करने के लिए हेज़ी के पोस्ट को संपादित किया है। एक बार जब संपादित की सहकर्मी-समीक्षा की जाती है, तो आपको जोड़ा गया replace=Falseपरम मिल जाएगा choice
0x24a537r9

8
@ 0x24a537r9 आपको ऐसा नहीं करना चाहिए। यह उसका जवाब है और आप इसे बदलते हैं। अगर आप चाहते हैं - अपना उत्तर जोड़ें तो अन्य लोगों के उत्तर न बदलें जो उत्तर को महत्वपूर्ण रूप से बदल देता है
सल्वाडोर डाली

@ साल्वाडोरदाली क्यों नहीं?
स्कॉट

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]और ~ 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)

यहाँ x, एक 'int' होना है जो उन पंक्तियों की संख्या को परिभाषित करता है जिन्हें आप बेतरतीब ढंग से चुनना चाहते हैं।


4
यह केवल तभी काम करता है जब old_arrayएक अनुक्रम या एक सेट होता है, न कि एक सुस्पष्ट सरणी [लिंक] ( docs.python.org/3/library/random.html#functions-for-fterences )
leermeester

2

यदि आप पंक्तियों के कई यादृच्छिक उप-भाग उत्पन्न करना चाहते हैं, उदाहरण के लिए यदि आपका RANSAC।

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, :]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.