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


260

অজগর দিয়ে কোন অ্যারে বদলানোর সহজতম উপায় কী?


28
পাইথন ডকুমেন্টেশনের সবচেয়ে দরকারী বিটকে সর্বদা উচ্চতর এসও প্রশ্নোত্তর বিন্যাসে স্থানান্তরিত করার জন্য +1।
Charleslparker

1
এমন কোনও বিকল্প আছে যা মূল অ্যারেটিকে পরিবর্তিত করে না তবে একটি নতুন শিফলেড অ্যারে ফেরত দেয়?
চার্লি পার্কার

5
আপনি একটি নতুন অ্যারে (অশোধিত) পেতে পারেন new_array = random.sample( array, len(array) )
চার্লি পার্কার

উত্তর:


463
import random
random.shuffle(array)

3
এমন কোনও বিকল্প আছে যা মূল অ্যারেটিকে পরিবর্তিত করে না তবে একটি নতুন শিফলেড অ্যারে ফেরত দেয়?
চার্লি পার্কার

@ চার্লি এটি আলাদা প্রশ্নে জিজ্ঞাসা করা ভাল। (সম্ভবত অন্য কেউ এটি ইতিমধ্যে জিজ্ঞাসা করেছে))
ডেভিড জেড

13
হাস্যকরভাবে যথেষ্ট, আমি যখন "পাইথন শ্যাফেল অ্যারে" সন্ধান করেছি তখন এই পৃষ্ঠাটি গুগলের শীর্ষে হিট
জোশুয়া হুবার

2
@ চার্লি লোকেরা গুগল এই প্রশ্নগুলি যাতে তারা স্ট্যাক ওভারফ্লোয়ের মতো জায়গায় তাদের উত্তর খুঁজে পেতে পারে। যতক্ষণ এটি ডুপ্লিকেট নয়, সেখানে স্ট্যাকের ওভারফ্লোটিকে একটি উত্স হিসাবে বিকল্প হিসাবে তৈরি করার কোনও সমস্যা নেই
ম্যাট

@ জাভাদ্ব্বা আসলে এটাই প্রথম প্রশ্নের উত্তর ছিল। গুগলে কিছু খনন করে পাওয়া গেলেও স্ট্যাক ওভারফ্লোতে প্রশ্ন জিজ্ঞাসা করার কোনও সমস্যা নেই। ভবিষ্যতের লোকেরা যখন তাদের নিজস্ব খনন করে তখন উত্তরটিকে স্ট্যাকওভারফ্লোতে খুঁজে পেতে দেয়।
ম্যাট


36

স্কেলার্ন ব্যবহার করে এটি করার বিকল্প উপায়

from sklearn.utils import shuffle
X=[1,2,3]
y = ['one', 'two', 'three']
X, y = shuffle(X, y, random_state=0)
print(X)
print(y)

আউটপুট:

[2, 1, 3]
['two', 'one', 'three']

সুবিধা: আপনি ম্যাপিং ব্যাহত না করে একসাথে একাধিক অ্যারে এলোমেলো করতে পারেন। এবং 'এলোমেলো_স্টেট' প্রজননযোগ্য আচরণের জন্য এলোমেলো নিয়ন্ত্রণ করতে পারে।


1
ধন্যবাদ, একবারে দুটি অ্যারে বদলানো খুব দরকারী।
দিমিত্রি

1
এটি খুঁজছিল, টিএনএক্স!
18

2
এটি গৃহীত উত্তরের চেয়ে আরও সম্পূর্ণ (এবং প্রায়শই দরকারী)
জাভাদ্ব্বা

21

অন্যান্য উত্তরগুলি সবচেয়ে সহজ, তবে এটি কিছুটা বিরক্তিকর যে random.shuffleপদ্ধতিটি আসলে কোনও কিছুই ফেরায় না - এটি কেবলমাত্র প্রদত্ত তালিকাকে সাজিয়ে তোলে। আপনি যদি কল চেইন করতে চান বা কেবল একটি লাইনে একটি শিফल्ड অ্যারে ঘোষণা করতে সক্ষম হন তবে আপনি এটি করতে পারেন:

    import random
    def my_shuffle(array):
        random.shuffle(array)
        return array

তারপরে আপনি লাইনগুলি এর মতো করতে পারেন:

    for suit in my_shuffle(['hearts', 'spades', 'clubs', 'diamonds']):

7
এটি নির্দিষ্টভাবে কোনও কিছুই ফেরায় না কারণ এটি আপনাকে মনে করিয়ে দেওয়ার চেষ্টা করছে যে এটি ইনপুটটি জায়গায় পরিবর্তন করে কাজ করে। (এটি স্মৃতি সংরক্ষণ করতে পারে)) আপনার ফাংশনটি এর ইনপুটটিকেও জায়গায় পরিবর্তন করে।
জন ওয়াই

2
আমার ধারণা এটি একটি স্টাইলের জিনিস। ব্যক্তিগতভাবে আমি এই বিষয়টিকে প্রাধান্য দিয়েছি যে একটি দম্পতি অন্যথায় কী গ্রহণ করবে তা অর্জনের জন্য আমি একটি লাইন লিখতে পারি। এটি আমার কাছে অদ্ভুত বলে মনে হচ্ছে যে কোনও ভাষা যা প্রোগ্রামকে যতটা সম্ভব সংক্ষিপ্ততর করার মঞ্জুরি দেয় তা এই ক্ষেত্রেগুলিতে পাস করা বস্তুটিকে ফেরত দিতে ঝোঁক করে না। যেহেতু এটি ইনপুটটিকে স্থানে পরিবর্তন করে দেয় তাই আপনি ইস্যু ছাড়াই এই সংস্করণটিতে কল করার জন্য এলোমেলোভাবে কল করতে পারবেন sh
মার্ক রোডস

12
পাইথন আসলে যতটা সম্ভব সংক্ষিপ্ত হওয়ার লক্ষ্য রাখে না। পাইথনটির উদ্দেশ্য প্রকাশের সাথে পাঠ্যতা ভারসাম্যপূর্ণ করা। এটি মোটামুটি সংক্ষিপ্ত হতে দেখা যায়, মূলত এটি খুব উচ্চ-স্তরের ভাষা বলে। পাইথনের নিজস্ব বিল্ট-ইনগুলি সাধারণত (সর্বদা নয়) হয় "ফাংশন লাইক" হওয়ার চেষ্টা করে (কোনও মান ফেরত দেয় তবে পার্শ্ব প্রতিক্রিয়া হয় না) বা "পদ্ধতিধর্মী" হতে হয় (পার্শ্ব প্রতিক্রিয়াগুলির মাধ্যমে পরিচালনা করুন এবং কোনও কিছুই ফেরত পাবেন না)। এটি পাইথনের বক্তব্য এবং অভিব্যক্তিগুলির মধ্যে বেশ কঠোর পার্থক্যের সাথে হাত মিলিয়ে যায়।
জন ওয়াই

খুশী হলাম। কোডের পার্থক্যটি তাত্ক্ষণিকভাবে দেখার জন্য আমি এটির_পরিবর্তনকারী নামটি পরিবর্তন করার পরামর্শ দিই।
জাব্বা

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

12

নিয়মিত পাইথন তালিকাগুলি random.shuffle()নিয়ে কাজ করার সময় পূর্ববর্তী উত্তরগুলি দেখায় ঠিক তেমন কাজ করবে।

তবে যখন এটি ndarray( numpy.array) এ আসে তখন random.shuffleমনে হয় আসলটি ভেঙে যায় ndarray। এখানে একটি উদাহরণ:

import random
import numpy as np
import numpy.random

a = np.array([1,2,3,4,5,6])
a.shape = (3,2)
print a
random.shuffle(a) # a will definitely be destroyed
print a

শুধু ব্যবহার করুন: np.random.shuffle(a)

পছন্দ করুন random.shuffle, np.random.shuffleজায়গায় অ্যারে পরিবর্তন করুন।


2
ধ্বংস মানে ঠিক কি? (এর অর্থ এই প্রসঙ্গে - আমি কোনও ইএলএল নই।)
ডিবি্লিস

আচ্ছা আমি যদি এ = এনপি.আররে (রেঞ্জ (9)) চেষ্টা করি তবে পুনরায় আকার দিন ([3,3])
নিকোলাস ম্যাককার্টি


3

আপনি এ্যান্ডম কি দিয়ে আপনার অ্যারে বাছাই করতে পারেন

sorted(array, key = lambda x: random.random())

কী কেবল একবার পড়তে হবে তাই সাজানোর সময় আইটেমের তুলনায় দক্ষ এখনও।

কিন্তু মত চেহারা random.shuffle(array)দ্রুততর হবে যেহেতু এটি সি লিখিত


1
এটি অ্যারের প্রতিটি উপাদানের জন্য একটি নতুন এলোমেলো উপাদান তৈরি করে?
জাভাদ্বা

@ জাভাদবা না, এটি কেবল এলোমেলো সূচী অনুসারে একটি অ্যারে বাছাই করুন যা শেষ হয়ে যাবে অ্যারে পরিবর্তন করে
ত্রিনিহ হোয়াং নহু

1
দুঃখিত আমি হয়ত পরিষ্কার হয় নি আমি বলতে চাচ্ছি করা হয়নি arrayআমি বোঝানো Randomঅর্থাৎ: উপাদান নতুন উৎপাদিত হতে পারে শ্রেণী উদাহরণস্বরূপ প্রতিটি সময়। আমি আসলে নিশ্চিত নই: এটির জন্য এটি ভুল উপায় হবে: আপনার একটি তৈরি করা উচিত এবং তারপরে এটি প্রার্থনা করা উচিত । তবে অজগর কীভাবে কাজ করে তা নিশ্চিত নয়lambdarandom.random()RandomjavaRandom rng = Random()rng.nextGaussian()random.random()
জাভদ্বা

1
আপনার কোডটি উত্তর হিসাবে সংশোধন করতে পারে তবে আপনার কোডটি কী করে তা ব্যাখ্যা করে এটি আপনার উত্তরের গুণমান উন্নত করতে পারে। নিবন্ধটি দেখুন: আমি কীভাবে একটি ভাল উত্তর লিখতে পারি?
LuFFy

1

পূর্ববর্তী উত্তরগুলি ছাড়াও, আমি আরও একটি ফাংশন প্রবর্তন করতে চাই।

numpy.random.shuffleপাশাপাশি random.shuffleজায়গায় স্থান পরিবর্তন করতে পারেন। তবে, আপনি যদি কোনও বদলানো অ্যারেটি ফিরিয়ে দিতে চান তবে numpy.random.permutationএটি হ'ল ফাংশন।


1

আমি জানি না আমি ব্যবহার করেছি random.shuffle()তবে এটি আমার কাছে 'কিছুই নয়', সুতরাং আমি এটি লিখেছি, কারও পক্ষে সহায়ক হতে পারে

def shuffle(arr):
    for n in range(len(arr) - 1):
        rnd = random.randint(0, (len(arr) - 1))
        val1 = arr[rnd]
        val2 = arr[rnd - 1]

        arr[rnd - 1] = val1
        arr[rnd] = val2

    return arr

2
হ্যাঁ এটি কিছুই দেয় না, তবে অ্যারে সংশোধন করা হয়, আপনি যদি সত্যিই কিছু ফিরিয়ে দিতে চান তবে এই আমদানিটি এলোমেলো ডিফ শফল (আরআর) করুন: random.shuffle (এআর) রিটার্ন অ্যারে
user781903

0
# arr = numpy array to shuffle

def shuffle(arr):
    a = numpy.arange(len(arr))
    b = numpy.empty(1)
    for i in range(len(arr)):
        sel = numpy.random.random_integers(0, high=len(a)-1, size=1)
        b = numpy.append(b, a[sel])
        a = numpy.delete(a, sel)
    b = b[1:].astype(int)
    return arr[b]

0

সচেতন থাকুন যে random.shuffle()বহুমাত্রিক অ্যারে ব্যবহার করা উচিত নয় কারণ এটি পুনরাবৃত্তি ঘটায়।

কল্পনা করুন যে আপনি কোনও অ্যারের প্রথম মাত্রা বরাবর পরিবর্তন করতে চান, আমরা নিম্নলিখিত পরীক্ষার উদাহরণ তৈরি করতে পারি,

import numpy as np
x = np.zeros((10, 2, 3))

for i in range(10):
   x[i, ...] = i*np.ones((2,3))

যাতে প্রথম অক্ষ বরাবর, i-th উপাদানটি 2x3 ম্যাট্রিক্সের সাথে মিলিত হয় যেখানে সমস্ত উপাদান i এর সমান।

আমরা যদি বহুমাত্রিক অ্যারেগুলির জন্য সঠিক শফল ফাংশনটি ব্যবহার করি np.random.shuffle(x), তবে অ্যারেটি প্রথম অক্ষের সাথে পছন্দসইভাবে বদলে যাবে। তবে, ব্যবহারের random.shuffle(x)ফলে পুনরাবৃত্তি ঘটবে। আপনি len(np.unique(x))এলোমেলো করে চালিয়ে যাচাই করে দেখতে পারেন যা ব্যবহারের সময় আপনাকে কেবল 10 (প্রত্যাশামতো) দেয় np.random.shuffle()তবে কেবল 5 টির সাথে random.shuffle()

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.