2017-02-01 10 views
5

तक पहुंचने के लिए मुझे एक कक्षा बनाने की आवश्यकता है जो एक पैरामीटर के रूप में एक यादृच्छिक संख्या जनरेटर (यानी numpy.random.RandomState ऑब्जेक्ट) लेता है। यदि इस तर्क को निर्दिष्ट नहीं किया गया है, तो मैं इसे यादृच्छिक जनरेटर को असाइन करना चाहता हूं जो numpy.random.<random-method> चलाते समय numpy उपयोग करता है। मैं इस वैश्विक जनरेटर का उपयोग कैसे करूं? वर्तमान में मैं मॉड्यूल ऑब्जेक्ट को यादृच्छिक जनरेटर के रूप में असाइन करके कर रहा हूं (क्योंकि वे विधियों/बतख टाइपिंग साझा करते हैं)। हालांकि यह चुनने पर मुद्दों का कारण बनता है (मॉड्यूल ऑब्जेक्ट को चुनने में असमर्थ) और गहरी प्रतिलिपि। मैंnumpy डिफ़ॉल्ट वैश्विक यादृच्छिक संख्या जनरेटर

पुनश्च numpy.random पीछे RandomState वस्तु का उपयोग करना चाहेंगे: मैं अजगर-3,4

+0

@ user2357112 सामान्य तौर पर मैं मॉड्यूल, picklable होने के लिए, क्योंकि वे unpicklable वस्तुओं (सी एक्सटेंशन, lambdas, बंद आदि) –

+0

@ali_m के सभी तरह के हो सकते हैं अपेक्षा नहीं: मैं कर सकता है उन्होंने शपथ ली है कि वे फंसे हुए थे और नाम से अनपढ़ थे, जैसे कार्यों और वर्गों की तरह, लेकिन स्पष्ट रूप से नहीं। जब मैं कोशिश करता हूं, मुझे भी एक त्रुटि मिलती है। – user2357112

+0

@ user2357112 कुछ भी नहीं है * आंतरिक रूप से * मॉड्यूल के बारे में unpicklable। जब तक वे केवल पिकलेबल ऑब्जेक्ट्स रखते हैं तो आप ठीक होते हैं, लेकिन अधिकांश गैर-तुच्छ मॉड्यूल के लिए यह मामला नहीं है। उदाहरण के लिए, numpy unpicklable सी एक्सटेंशन के साथ riddled है। –

उत्तर

2

साथ ही kazemakase क्या पता चलता है, हम इस तथ्य का लाभ ले सकते है कि numpy.random.random तरह मॉड्यूल स्तर के कार्यों वास्तव में उन तरीकों में से एक से सीधे __self__ खींच कर एक छिपा हुआ numpy.random.RandomState के तरीके हैं के रूप में:

numpy_default_rng = numpy.random.random.__self__ 
+0

दरअसल, यह सीधे _rand का उपयोग करने से अधिक भविष्य-सबूत प्रतीत होता है। धन्यवाद, मुझे टोपी नहीं पता था कि '__self__' विशेषता' जैसी चीज थी। – Atimaharjun

2

numpy.randomnumpy.random.mtrand से आयात * है, जो एक विस्तार मॉड्यूल Cython में लिखा है उपयोग कर रहा हूँ। source code दिखाता है कि वैश्विक स्थिति चर _rand में संग्रहीत है। यह चर is not importednumpy.random दायरे में है लेकिन आप इसे सीधे mtrand से प्राप्त कर सकते हैं।

import numpy as np 
from numpy.random.mtrand import _rand as global_randstate 

np.random.seed(42) 
print(np.random.rand()) 
# 0.3745401188473625 

np.random.RandomState().seed(42) # Different object, does not influence global state 
print(np.random.rand()) 
# 0.9507143064099162 

global_randstate.seed(42) # this changes the global state 
print(np.random.rand()) 
# 0.3745401188473625 
+0

मैंने प्रश्न पोस्ट करते समय ऐसा करने का फैसला किया, हालांकि मैं उम्मीद कर रहा था कि छिपे हुए सदस्यों (भावी-प्रमाण के लिए) को टैप किए बिना मैं इसे प्राप्त कर सकता हूं। user2357112 की विधि इसे अनुमति देने लगती है। तो मैंने इसे जवाब के रूप में चुना है। फिर भी प्रतिक्रिया के लिए धन्यवाद। – Atimaharjun

0

मुझे नहीं पता कि वैश्विक स्थिति तक कैसे पहुंचे। हालांकि, आप एक RandomState ऑब्जेक्ट का उपयोग कर सकते हैं और इसे पास कर सकते हैं। यादृच्छिक वितरण इससे जुड़े हुए हैं, इसलिए आप उन्हें विधियों के रूप में कहते हैं।

उदाहरण:

import numpy as np 

def computation(parameter, rs): 
    return parameter*np.sum(rs.uniform(size=5)-0.5) 

my_state = np.random.RandomState(seed=3) 

print(computation(3, my_state)) 
संबंधित मुद्दे