স্তম্ভিত জায়গায় কোনও ম্যাট্রিক্স স্থানান্তর করুন


27

পাইথনের আকাঙ্ক্ষিত গ্রন্থাগারটি ব্যবহার করে এর কয়েকটি সারি এবং কলামের ক্রম পরিবর্তন করে আমি জায়গায় ঘন বর্গাকার ট্রানজিশন ম্যাট্রিক্সকে সংশোধন করতে চাই। গাণিতিকভাবে এটি মেট্রিক্সকে পেরিউটেশন ম্যাট্রিক্স পি দ্বারা প্রাক-গুণিত করার এবং এটি পি ^ -1 = পি ^ টি দ্বারা পোস্ট-গুণিত করার সাথে মিলে যায় তবে এটি একটি গণনামূলক যুক্তিসঙ্গত সমাধান নয়।

এই মুহুর্তে আমি ম্যানুয়ালি সারি এবং কলামগুলি অদলবদল করছি, তবে আমি নম্পির একটি ভাল ফাংশন F (এম, ভি) থাকবে বলে আশা করব যেখানে এম এর n টি সারি এবং কলাম রয়েছে, এবং v এর এন এন্ট্রি রয়েছে, যাতে f (এম, ভি) আপডেট হয় এম সূচকের অনুমতি অনুসারে বনাম। সম্ভবত আমি কেবল ইন্টারনেটে অনুসন্ধানে ব্যর্থ হয়েছি।

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

যোগ করা হয়েছে:
কখনও কখনও লোকেরা ক্রমশক্তি নিয়ে কথা বলার সময় তাদের অর্থ কেবল এলোমেলো আদেশের নমুনা বোঝানো হয়, উদাহরণস্বরূপ পরিসংখ্যানগুলিতে পি-মানগুলি অর্জনের পদ্ধতির অংশ হিসাবে। অথবা এর অর্থ সমস্ত সম্ভাব্য ক্রমশক্তি গণনা বা গণনা করা। আমি এই জিনিস সম্পর্কে কথা বলছি না।

যোগ করা হয়েছে:
ম্যাট্রিক্সটি ডেস্কটপ র্যামের সাথে ফিট করার জন্য যথেষ্ট ছোট তবে এত বড় যে আমি এটিকে চিন্তাভাবনা করে অনুলিপি করতে চাই না। প্রকৃতপক্ষে আমি যতটা সম্ভব ম্যাট্রিকগুলি ব্যবহার করতে চাই, তবে আমি তাদের র‍্যামে ধরে রাখতে না পারার অসুবিধার সাথে মোকাবিলা করতে চাই না এবং আমি ম্যাট্রিক্সের ও (N ^ 3) ল্যাপাক অপারেশনও করি ব্যবহারিক ম্যাট্রিক্স আকার সীমাবদ্ধ। আমি বর্তমানে ম্যাট্রিকগুলি এই অযৌক্তিকভাবে অনুলিপি করছি, তবে আমি আশা করি এটি সহজেই ছাড়ার জন্য এড়ানো যেতে পারে।


3
আপনার ম্যাট্রিকেসের আকার দেওয়ার জন্য আপনি যদি প্রশ্নটি আপডেট করতে পারেন তবে এটি ভাল। "বিশাল" অর্থ সমস্ত লোকের কাছে একই জিনিস নয়।
বিল বার্থ

2
আপনি ঠিক বলেছেন যে উন্নত (বা তথাকথিত অভিনব) সূচকগুলি একটি অনুলিপি তৈরি করে। তবে আপনি যদি সেই M[v]সত্যটির সাথে থাকতে চান তবে আপনার কোডটি কেবল সারিগুলিকে অনুমতি দেওয়ার জন্য।
ড্যানিয়েল ভেলকভ

@ ডানিয়েল: এবং পুরো এমমিটেশনটি এম [ভি,:] [:, ভি] করা কি হবে? অভিনব ইনডেক্সিং ব্যবহার করে এই অনুমতি দেওয়া কি সর্বোত্তম উপায়? এবং এটি কি ম্যাট্রিক্সের মেমরির সাথে ম্যাট্রিক্সের মাপ, সারি + কলাম অনুমোদিত ম্যাট্রিক্স এবং অস্থায়ী সারি অনুমোদিত ম্যাট্রিক্স ব্যবহার করবে?
নয়

এটি সঠিক, আপনার কাছে আপনার মূল ম্যাট্রিক্স এবং 2 টি অনুলিপি থাকবে। বিটিডব্লিউ কেন আপনার একই সাথে উভয় সারি এবং কলামগুলি ক্রমান্বিত করতে হবে?
ড্যানিয়েল ভেলকভ

4
অনুমোদিত ম্যাট্রিক্স নিয়ে আপনি কী করতে যাচ্ছেন? অপারেটর প্রয়োগ করার সময় কেবল ভেক্টরকে অনুমতি দেওয়া ভাল।
জেড ব্রাউন

উত্তর:


9

দস্তাবেজগুলির মতে, নাম্পায় কোনও স্থানস্থ স্থান ক্রিয়াকলাপ নেই, ndarray.sort এর মতো কিছু ।

MN×Np

  1. এক্সটেনশন মডিউল হিসাবে সিতে আপনার নিজস্ব অ্যালগরিদম বাস্তবায়ন করুন (তবে স্থানটিতে থাকা অ্যালগরিদমগুলি আমার পক্ষে কমপক্ষে শক্ত!)
  2. N

    for i in range(N):
        M[:,i] = M[p,i]
    for i in range(N):
        M[i,:] = M[i,p]
  3. N2

    M[:,:] = M[p,:]
    M[:,:] = M[:,p]

আশা করি এই সাবওটিম্যাটাল হ্যাকগুলি কার্যকর।


@ কোনটি হ্যাক 2
স্টেফানো এম

1
O(N)p

O(N)O(N)

2
এটি একটি সিথন ফাংশনের জন্য সত্যিই ভাল ক্যানিডেট। শোডল 10 লাইনের বেশি হবে না। । । আমাকে একটি ক্র্যাক দিতে চান?
meawoppl

হাঃ হাঃ হাঃ. আমি এটি সিথনে শুরু করেছিলাম, তারপরে একটি ফাংশনে সঠিক উত্তর পেয়েছি যা আমি সমস্ত সময় ব্যবহার করি। ডোহ। আমার পোস্ট উত্তর দেখুন।
meawoppl

6

সতর্কতা: নীচের উদাহরণটি সঠিকভাবে কাজ করে তবে পোস্টের শেষে প্রস্তাবিত প্যারামিটারগুলির পুরো সেটটি ব্যবহার করে একটি বাগ বা কমপক্ষে কমপক্ষে একটি "অননুমোদিত বৈশিষ্ট্য" প্রকাশিত হয় num বিস্তারিত জানার জন্য নীচে মন্তব্য দেখুন। বাগ রিপোর্ট দায়ের করা হয়েছে

আপনি এটিকে নম্পির টেক () ফাংশন সহ জায়গায় করতে পারেন তবে এটির জন্য খানিকটা হুপ জাম্পিং দরকার।

এখানে একটি পরিচয় ম্যাট্রিক্সের সারিগুলির এলোমেলোভাবে অনুচ্ছেদ করার একটি উদাহরণ রয়েছে:

import numpy as np
i = np.identity(10)
rr = range(10)
np.random.shuffle(rr)
np.take(i, rr, axis=0)
array([[ 0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.],
       [ 1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.]])

এটি যথাস্থানে করতে, আপনাকে যা করতে হবে তা হ'ল "আউট" প্যারামিটারটি ইনপুট অ্যারের সমান হতে হবে এবং আপনাকে মোড = "ক্লিপ" বা মোড = "মোড়ানো" সেট করতে হবে। আপনি যদি মোডটি সেট না করেন এটি পাইথন ব্যতিক্রমের সাথে অ্যারে স্থিতি পুনরুদ্ধার করতে একটি অনুলিপি তৈরি করবে (এখানে দেখুন)

একটি চূড়ান্ত নোটে, নেওয়া একটি অ্যারে পদ্ধতি বলে মনে হচ্ছে, তাই পরিবর্তে

np.take(i, rr, axis=0)

আপনি কল করতে পারে

i.take(rr, axis=0)

যদি এটি আপনার স্বাদে বেশি হয়। সুতরাং মোটে আপনি কল করার জন্য নীচের মত কিছু দেখতে হবে:

#Inplace Rearrange
arr = makeMyBixMatrix()
pVec0, pVec1 = calcMyPermutationVectors()
arr.take(pVec0, axis=0, out=arr, mode="clip")
arr.take(pVec1, axis=1, out=arr, mode="clip")

সারি এবং কলাম উভয়কেই ক্রমবর্ধমান করার জন্য আমি মনে করি আপনাকে এটি দুবার চালাতে হবে, অথবা নাম্পি.উনরভেল_ইন্ডেক্স সহ কিছু কুরুচিপূর্ণ শেনানিগান টানুন যা আমার মাথাতে ভাবতে ব্যথা করে।


যেমনটি বলা হয়েছে, জায়গায় অ্যালগরিদমগুলি শক্ত। আপনার সমাধানটি নাম্বার 1.6.2 এর সাথে কাজ করে না । এবং 1.7.1 (নকল সারি / কলামগুলি)। 1.8.x এই সমস্যাটি ঠিক করে কিনা তা খতিয়ে দেখার কোনও সময় নেই
স্টেফানো এম

হুম। আপনি কোথাও পরীক্ষার কোড পোস্ট করতে পারেন? আমার মাথায়, আমি অনুভব করছি যেন প্লাকিংয়ের আগে প্রথমে ঘটে যাওয়া সূচকগুলিতে একটি বাছাইয়ের কাজ করা দরকার। আমি এই প্রধানমন্ত্রীর আরও তদন্ত করব।
meawoppl

1
আমি যখন চালানো এই কোড আমি পেতে 1.6.2, test take, not overwriting: True, test not-in-place take: True, test in-place take: False, rr [3, 7, 8, 1, 4, 5, 9, 0, 2, 6], arr [30 70 80 70 40 50 90 30 80 90], ref [30 70 80 10 40 50 90 0 20 60]। সুতরাং np.takenumpy 1.6.2 জন্য অন্তত একটি ইন-জায়গা বিন্যাস ও messes জিনিষ আপ করছেন সচেতন নয়।
স্টেফানো এম

Yeouch। ভাল প্রদর্শিত। এটি সম্ভবত বাগ আইএমএইচও হিসাবে যোগ্যতা অর্জন করে। খুব কমপক্ষে ডক্সকে বলা উচিত ইনপুট এবং আউটপুট একই অ্যারে হতে পারে না, সম্ভবত এটি পরীক্ষা করা আছে কিনা তা দেখার জন্য এবং পরীক্ষা করুন।
meawoppl

বাগের সাথে একমত হয়েছে: পাঠকদের সাবধান করার জন্য আপনার পোস্টে একটি নোট যুক্ত করা উচিত যে আপনার সমাধানটি ভুল ফলাফল আনতে পারে।
স্টেফানো এম

2

আপনার যদি COOফর্ম্যাটে একটি স্পর্শযুক্ত ম্যাট্রিক্স সঞ্চিত থাকে তবে নিম্নলিখিতগুলি সহায়ক হতে পারে

    A.row = perm[A.row];
    A.col = perm[A.col];

ACOOpermnumpy.arraymm


তবে সম্পূর্ণ ঘন ম্যাট্রিক্সকে C00প্রথম স্থানে বিরল ম্যাট্রিক্স হিসাবে সংরক্ষণ করার জন্য মেমরির ওভারহেড কী ?
ফেডারিকো পোলোনি

intfloatfloatn2numpy.ndarray

1

মন্তব্য করার মতো যথেষ্ট খ্যাতি আমার নেই, তবে আমি মনে করি নিম্নলিখিত এসও প্রশ্নটি সহায়ক হতে পারে: /programming/4370745/view-onto-a-numpy-array

বেসিক পয়েন্টগুলি হ'ল আপনি বেসিক স্লাইসিং ব্যবহার করতে পারেন এবং এটি অনুলিপি ছাড়াই অ্যারেতে একটি ভিউ তৈরি করবে তবে আপনি যদি অগ্রসর স্লাইসিং / ইনডেক্সিং করেন তবে এটি একটি অনুলিপি তৈরি করবে


ওপি একটি অনুমতি চেয়েছে, এবং এটি বেসিক কাটা দিয়ে সম্ভব নয় lic
স্টেফানো এম

আপনি অবশ্যই সঠিক। আমি ভেবেছিলাম যে কপিগুলি কখন ঘটবে সে সম্পর্কে তারা উদ্বিগ্ন ছিলেন বলে টুকরো টুকরো করে কী ঘটছে (যদি তারা জানেন না) তবে এটি ওপিকে বুঝতে কার্যকর হবে। যদি সে আপনার উত্তর থেকে কিছু ব্যবহার করে তবে আমি মনে করি এটি জেনে রাখা ভাল যেহেতু আপনি এগুলি আপনার লুপের ভিতরে ব্যবহার করেন।
পেয়েছি

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