অনুলিপি অ্যারের সাথে অনুলিপি


108

উদাহরণস্বরূপ, যদি আমাদের কাছে numpyঅ্যারে থাকে Aএবং আমরা একই উপাদানগুলির সাথে একটি numpyঅ্যারে চাই B

নিম্নলিখিত (নীচের দেখুন) পদ্ধতির মধ্যে পার্থক্য কী? অতিরিক্ত মেমরি কখন বরাদ্দ করা হয়, এবং কখন হয় না?

  1. B = A
  2. B[:] = A(একই B[:]=A[:]?)
  3. numpy.copy(B, A)

উত্তর:


135

তিনটি সংস্করণই বিভিন্ন কাজ করে:

  1. B = A

    এটি Bইতিমধ্যে নামযুক্ত বিদ্যমান অবজেক্টটির সাথে একটি নতুন নাম বাঁধে A। এরপরে তারা একই জিনিসটিকে উল্লেখ করে, সুতরাং আপনি যদি একটি জায়গায় পরিবর্তন করেন তবে আপনি অন্যটির মাধ্যমেও পরিবর্তনটি দেখতে পাবেন।

  2. B[:] = A(একই B[:]=A[:]?)

    এটি Aএকটি বিদ্যমান অ্যারে থেকে মানগুলি অনুলিপি করে B। এটি কাজ করার জন্য দুটি অ্যারের অবশ্যই একই আকার থাকতে হবে। B[:] = A[:]একই জিনিস (তবে B = A[:]1 এর মতো আরও কিছু করবে)।

  3. numpy.copy(B, A)

    এটি আইনী বাক্য গঠন নয়। আপনি সম্ভবত বোঝানো B = numpy.copy(A)। এটি প্রায় 2 এর সমান, তবে এটি অ্যারেটি পুনরায় ব্যবহার না করে নতুন অ্যারে তৈরি করে B। আগের Bমানটির সাথে অন্য কোনও উল্লেখ না থাকলে শেষের ফলাফলটি 2 এর সমান হবে তবে অনুলিপিটির সময় এটি অস্থায়ীভাবে আরও মেমরি ব্যবহার করবে।

    অথবা হতে পারে আপনি বোঝাতে চেয়েছিলেন numpy.copyto(B, A), যা আইনী, এবং 2 এর সমতুল্য?


21
@ মিঃ_আর_আমস_ডি: নম্পি অ্যারে তালিকার চেয়ে আলাদাভাবে কাজ করে। অ্যারে টুকরো টুকরো করা অনুলিপি তৈরি করে না, এটি বিদ্যমান অ্যারের ডেটাতে একটি নতুন দৃষ্টিভঙ্গি তৈরি করে।
ব্ল্যাককিংহাট

মানে কী but B = A[:] would do something more like 1? এই স্ট্যাকওভারফ্লো অনুযায়ী / new_list = old_list[:]a/ 2612815 এছাড়াও একটি অনুলিপি।
mrgloom

4
@ এমআরগ্লুম: নম্পি অ্যারে যখন বিষয়বস্তুগুলি কাটা এবং অনুলিপি করার বিষয়টি আসে তখন তালিকার চেয়ে আলাদাভাবে কাজ করে। অ্যারে হ'ল মেমরির অন্তর্নিহিত ব্লকের একটি "ভিউ" যেখানে সংখ্যার মানগুলি সংরক্ষণ করা হয়। এর মতো একটি স্লাইস করা some_array[:]একটি নতুন অ্যারে অবজেক্ট তৈরি করবে, তবে সেই নতুন বস্তুটি মূল অ্যারের মতো একই মেমরির একটি দৃশ্য হবে, যা অনুলিপি করা হয়নি। সে কারণেই আমি বলেছিলাম এটি আরও পছন্দ B = A। এটির জন্য সত্যিকারের অনুলিপিটির প্রয়োজনের O(1)চেয়ে কেবল স্থান এবং সময় লাগে O(n)
ব্ল্যাককিংস্ট

ডকুমেন্টেশন অনুসারে পছন্দের 'অনুলিপি' পদ্ধতিটি হ'ল B = A.copy()। তবে এই ফর্মটি ডিফল্টরূপে অর্ডার সংরক্ষণ করে না, আপনার প্রয়োজন B = A.copy(order='k')
হাওয়ার্ড লোভাত

27
  1. B=A একটি রেফারেন্স তৈরি করে
  2. B[:]=A একটি অনুলিপি তৈরি করে
  3. numpy.copy(B,A) একটি অনুলিপি তৈরি করে

শেষ দুটি অতিরিক্ত মেমরি প্রয়োজন।

একটি গভীর অনুলিপি তৈরি করতে আপনার প্রয়োজন B = copy.deepcopy(A)


4
আপনার দ্বিতীয় উদাহরণ উল্লেখ করা: B[:] = Aনেই না অবজেক্ট টাইপ, যেমন অ্যারে গভীর কপি করতে A = np.array([[1,2,3],[4,5]]); B = np.array([None,None], dtype='O')। এখন চেষ্টা করুন B[:] = A; B[0][0]=99, এটি এ এবং বি উভয় ক্ষেত্রেই প্রথম উপাদানটি পরিবর্তন করবে ! আমার জ্ঞান অনুসারে, একটি অনুলিপি-অ্যারে এমনকি গভীর অনুলিপি দেওয়ার গ্যারান্টি ছাড়া আর কোনও উপায় নেইcopy.deepcopy
রল্ফ বার্টস্ট্রা

11

এটি আমার পক্ষে একমাত্র কার্যকরী উত্তর:

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