ধারাবাহিকভাবে একই এলোমেলো নম্পি অ্যারে তৈরি করুন


91

আমি অন্য বিকাশকারীকে এমন এক কোডের সমাপ্তির জন্য অপেক্ষা করছি যা -1,0 বা 1 এর মান সহ আকারের এনপি অ্যারে (100,2000) প্রদান করবে।

ইতিমধ্যে, আমি এলোমেলোভাবে একই বৈশিষ্ট্যগুলির একটি অ্যারে তৈরি করতে চাই যাতে আমি আমার বিকাশ এবং পরীক্ষার দিকে অগ্রণী হতে পারি। জিনিসটি হ'ল আমি চাই যে এলোমেলোভাবে তৈরি করা অ্যারে প্রতিবার একই হয়, যাতে আমি এমন অ্যারের বিরুদ্ধে পরীক্ষা করিনা যা প্রতিবার আমার প্রক্রিয়াটি পুনরায় চালানোর সাথে সাথে এর মান পরিবর্তন করে চলে।

আমি এইভাবে আমার অ্যারে তৈরি করতে পারি তবে এটি তৈরি করার কোনও উপায় কি যাতে প্রতিবারের মতো হয়। আমি অবজেক্টটি আচার করে আনতে পারব, তবে ভাবছি অন্য কোনও উপায় আছে কিনা।

r = np.random.randint(3, size=(100, 2000)) - 1

উত্তর:


87

কেবলমাত্র একটি নির্দিষ্ট মান সহ এলোমেলো সংখ্যা জেনারেটর বীজ করুন

numpy.random.seed(42)

এইভাবে, আপনি সর্বদা একই এলোমেলো নম্বর ক্রম পাবেন।

এই ফাংশনটি গ্লোবাল ডিফল্ট এলোমেলো সংখ্যা জেনারেটর বীজ করবে এবং কোনও ফাংশনে যে কোনও কল numpy.randomতার রাজ্যের ব্যবহার এবং পরিবর্তন করবে। এটি অনেকগুলি সাধারণ ব্যবহারের ক্ষেত্রে ঠিক আছে তবে এটি বিশ্বব্যাপী সমস্ত সমস্যা নিয়ে বৈশ্বিক রাষ্ট্রের একটি রূপ। একটি পরিষ্কার সমাধানের জন্য নীচে রবার্ট কার্নের উত্তর দেখুন।


43
numpy.random.seed()যখন আমি মনোযোগ দিচ্ছিলাম না তখন কেউ ফাংশনটি ছোঁড়ে । :-) আমি ইচ্ছাকৃতভাবে এটি মূল মডিউলটির বাইরে রেখেছি। আমি প্রস্তাব দিই যে লোকেরা তাদের নিজস্ব দৃষ্টান্তগুলি ব্যবহার করে RandomStateএবং সেই জিনিসগুলি চারপাশে পাস করে।
রবার্ট কর্ন

6
রবার্ট নম্পতির একটি বড় অবদানকারী। আমি মনে করি আমাদের তাঁর মতামতকে কিছুটা ওজন দেওয়া উচিত।
অবচিত

11
@ অনুগ্রহপূর্বক: আমি রবার্টের কাজের জন্য কৃতজ্ঞ, তবে তাঁর কাজটি সুপারিশের পক্ষে যুক্তি দেওয়ার বিকল্প নয়। তদ্ব্যতীত, যদি ব্যবহারটি numpy.random.seed()নিরুৎসাহিত করা হয় তবে ডকুমেন্টেশনে এটি উল্লেখ করা উচিত । স্পষ্টতই, NumPy এর অন্যান্য অবদানকারীরা রবার্টের মতামত ভাগ করে না। কোনও অপরাধের উদ্দেশ্য নেই, আমি কেবল কৌতুহলী।
সোভেন মারনাচ

13
এটি পাইথন স্ট্যান্ডার্ড লাইব্রেরিতে random.seedকোনও random.Randomবস্তু ব্যবহার করে বনাম ব্যবহার করার মতো । আপনি ব্যবহার করেন তাহলে random.seedবা numpy.random.seed, আপনি seeding হয় সব আপনার কোডে এবং কোন কোড আছে, আপনি আহ্বান করা হয় অথবা যে পুলিশের হিসাবে একই সেশনে চালানো হয় কোন কোডে উভয় র্যান্ডম দৃষ্টান্ত। যদি সেই জিনিসগুলি সেই জিনিসগুলিকে আসলে এলোমেলোভাবে নির্ভর করে তবে আপনি সমস্যার মধ্যে পড়ে যেতে শুরু করুন। আপনি যদি এলোমেলো বীজ সেট করে এমন কোড স্থাপন করেন তবে আপনি সুরক্ষার দুর্বলতার পরিচয় দিতে পারেন।
asmeurer

4
@ এসম্যুরার সুরক্ষার উদ্দেশ্যে সিউডোরডম নম্বর জেনারেটর ব্যবহারকারী যে কেউ সম্ভবত তারা জানেন না যে তারা কী করছেন।
জ্যাব

191

numpy.random.RandomState()আপনার নির্বাচিত বীজের সাথে আপনার নিজস্ব উদাহরণ তৈরি করুন । numpy.random.seed()অবিচ্ছিন্ন লাইব্রেরিগুলির চারপাশে কাজ করা ব্যতীত ব্যবহার করবেন না যা আপনাকে নিজের RandomStateউদাহরণের বাইরে যেতে দেয় না।

[~]
|1> from numpy.random import RandomState

[~]
|2> prng = RandomState(1234567890)

[~]
|3> prng.randint(-1, 2, size=10)
array([ 1,  1, -1,  0,  0, -1,  1,  0, -1, -1])

[~]
|4> prng2 = RandomState(1234567890)

[~]
|5> prng2.randint(-1, 2, size=10)
array([ 1,  1, -1,  0,  0, -1,  1,  0, -1, -1])

7
আপনার প্রস্তাবনার জন্য আপনার কি কোনও যুক্তি আছে? এর সাথে কী হয়েছে numpy.random.seed()? আমি জানি এটি থ্রেড-নিরাপদ নয়, তবে আপনার যদি থ্রেড-নিরাপত্তার প্রয়োজন না হয় তবে এটি সত্যিই সুবিধাজনক।
সোভেন মারনাচ

52
এটি বেশিরভাগ ভাল অভ্যাস গঠন করা। আপনার এখন স্বাধীন স্ট্রিমের প্রয়োজন নাও হতে পারে, তবে এখন-থেকে সম্ভবত-সোভেন -6-মাসের হতে পারে। আপনি যদি সরাসরি লাইব্রেরিগুলি থেকে পদ্ধতিগুলি ব্যবহার করতে লিখেন তবে numpy.randomপরে আপনি স্বাধীন স্ট্রিম তৈরি করতে পারবেন না। পিআরএনজি স্ট্রিমগুলি নিয়ন্ত্রণ করার উদ্দেশ্য নিয়ে গ্রন্থাগারগুলি লেখা আরও সহজ। আপনার গ্রন্থাগারে প্রবেশের জন্য সর্বদা একাধিক উপায় রয়েছে এবং তাদের প্রত্যেকেরই বীজ নিয়ন্ত্রণ করার একটি উপায় থাকা উচিত। PRNG অবজেক্টের আশেপাশে পাস করা নির্ভর করার চেয়ে এটি করার একটি পরিষ্কার উপায় numpy.random.seed()। দুর্ভাগ্যক্রমে, এই মন্তব্য বাক্সটি আরও উদাহরণ সহ খুব সংক্ষিপ্ত। :-)
রবার্ট কার্ন

25
রবার্টের যুক্তি বর্ণনা করার আর একটি উপায়: numpy.random.seed ব্যবহার করে PRNG অবস্থা ধরে রাখতে একটি বৈশ্বিক পরিবর্তনশীল ব্যবহার করে এবং বৈশ্বিক ভেরিয়েবলগুলি খারাপ বলে একই মানক কারণগুলি এখানে প্রয়োগ করা হয়।
রবি বাসাক

9
আপনি যদি পিআরএনজিগুলি স্বাধীন হতে চান তবে এগুলিকে কিছু দিয়ে বানাবেন না। কেবল numpy.random.RandomState()কোনও যুক্তি ছাড়াই ব্যবহার করুন । এটি এই জাতীয় জিনিসগুলির জন্য আপনার অপারেটিং সিস্টেম সুবিধাগুলি থেকে আঁকা অনন্য মূল্যবোধের সাথে রাজ্যের বীজ বপন করবে ( /dev/urandomসেখানে ইউএনআইএক্স মেশিন এবং উইন্ডোজ সমতুল্য)। যদি আপনার numpy.random.RandomState(1234567890)পক্ষে কাজ না করে থাকে তবে দয়া করে আপনি কী টাইপ করেছেন এবং ঠিক যে ত্রুটি বার্তাটি পেয়েছেন তা প্রদর্শন করুন।
রবার্ট কর্ন

4
ভালো বুদ্ধি নই. numpy.random.RandomState()সেরা ফলাফলের জন্য কোনও যুক্তি ছাড়াই ব্যবহার করুন ।
রবার্ট কার্ন

3

আপনি যদি এলোমেলো অবস্থায় নির্ভর করে অন্যান্য ক্রিয়াকলাপগুলি ব্যবহার করে থাকেন তবে আপনি কেবল সেট এবং সামগ্রিক বীজ সেট করতে পারবেন না, পরিবর্তে আপনার র্যান্ডম সংখ্যার তালিকা তৈরি করার জন্য একটি ফাংশন তৈরি করতে হবে এবং বীজটিকে ফাংশনের প্যারামিটার হিসাবে সেট করতে হবে। এটি কোডে অন্য কোনও এলোমেলো জেনারেটরকে বিরক্ত করবে না:

# Random states
def get_states(random_state, low, high, size):
    rs = np.random.RandomState(random_state)
    states = rs.randint(low=low, high=high, size=size)
    return states

# Call function
states = get_states(random_state=42, low=2, high=28347, size=25)

3

এলোমেলো জেনারেটরের বীজ কী এবং আপনার কোডে কখন / কীভাবে সেট করা হয় তা বোঝা গুরুত্বপূর্ণ (যেমন , বীজের গাণিতিক অর্থের একটি সুন্দর ব্যাখ্যাের জন্য এখানে দেখুন )।

তার জন্য আপনাকে এগুলি করে বীজ সেট করতে হবে:

random_state = np.random.RandomState(seed=your_favorite_seed_value)

তারপরে এলোমেলো সংখ্যাগুলি এলোমেলো_স্টেট থেকে উত্পন্ন করা গুরুত্বপূর্ণ এবং এনপি.আরন্ডম থেকে নয়। অর্থাৎ আপনার করা উচিত:

random_state.randint(...)

পরিবর্তে

np.random.randint(...) 

যা র‌্যান্ডমস্টেট () এর একটি নতুন উদাহরণ তৈরি করবে এবং মূলত বীজ সেট করতে আপনার কম্পিউটারের অভ্যন্তরীণ ঘড়িটি ব্যবহার করবে।


2

আমি কেবলমাত্র রবার্ট কার্নের উত্তর সম্পর্কে কিছু স্পষ্ট করতে চাই যে বিষয়টি পরিষ্কার নয় in এমনকি আপনি যদি এটি ব্যবহার করেন RandomStateতবে প্রতিবার আপনি যখন রবার্টের উদাহরণের মতো ন্যাক্পি এলোমেলো পদ্ধতিতে কল করবেন অন্যথায় আপনি নিম্নলিখিত ফলাফলগুলি পেয়ে যাবেন।

Python 3.6.9 |Anaconda, Inc.| (default, Jul 30 2019, 19:07:31) 
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> prng = np.random.RandomState(2019)
>>> prng.randint(-1, 2, size=10)
array([-1,  1,  0, -1,  1,  1, -1,  0, -1,  1])
>>> prng.randint(-1, 2, size=10)
array([-1, -1, -1,  0, -1, -1,  1,  0, -1, -1])
>>> prng.randint(-1, 2, size=10)
array([ 0, -1, -1,  0,  1,  1, -1,  1, -1,  1])
>>> prng.randint(-1, 2, size=10)
array([ 1,  1,  0,  0,  0, -1,  1,  1,  0, -1])
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.