1. NumPy আকারের অর্থ
আপনি লিখেন, "আমি আক্ষরিক অর্থে জানি এটির তালিকা এবং তালিকার তালিকার তালিকা যেখানে সমস্ত তালিকায় কেবল একটি সংখ্যা থাকে" তবে এটি সম্পর্কে চিন্তাভাবনা করা কিছুটা অপ্রয়োজনীয় উপায়।
নম্পপি অ্যারেগুলি সম্পর্কে ভাবার সেরা উপায় হ'ল এগুলি দুটি অংশ নিয়ে গঠিত, একটি ডেটা বাফার যা কেবল কাঁচা উপাদানগুলির একটি ব্লক, এবং এমন একটি ভিউ যা ডেটা বাফারকে কীভাবে ব্যাখ্যা করতে হয় তা বর্ণনা করে।
উদাহরণস্বরূপ, আমরা যদি 12 টি পূর্ণসংখ্যার অ্যারে তৈরি করি:
>>> a = numpy.arange(12)
>>> a
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
তারপরে aএকটি ডেটা বাফারের সমন্বয়ে এমন কিছু সাজানো থাকে:
┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┐
│ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 10 │ 11 │
└────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┘
এবং এমন একটি দর্শন যা ডেটা ব্যাখ্যা করতে পারে তা বর্ণনা করে:
>>> a.flags
C_CONTIGUOUS : True
F_CONTIGUOUS : True
OWNDATA : True
WRITEABLE : True
ALIGNED : True
UPDATEIFCOPY : False
>>> a.dtype
dtype('int64')
>>> a.itemsize
8
>>> a.strides
(8,)
>>> a.shape
(12,)
এখানে আকৃতি (12,) মানে অ্যারের একটি একক সূচক যা 0 থেকে 11 ধারণার দিক থেকে রান দ্বারা সূচীবদ্ধ, তখন আমরা এই একক INDEX লেবেল যদি i, এরে aভালো দেখায়:
i= 0 1 2 3 4 5 6 7 8 9 10 11
┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┐
│ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 10 │ 11 │
└────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┘
আমরা যদি একটি অ্যারে পুনরায় আকার তুলি তবে এটি ডেটা বাফারকে পরিবর্তন করে না। পরিবর্তে, এটি একটি নতুন দৃষ্টিভঙ্গি তৈরি করে যা ডেটা ব্যাখ্যা করার জন্য আলাদা উপায়ে বর্ণনা করে। তাহলে পরে:
>>> b = a.reshape((3, 4))
অ্যারের bমতো একই ডেটা বাফার রয়েছে aতবে এখন এটি দুটি সূচকে সূচকযুক্ত যা যথাক্রমে 0 থেকে 2 এবং 0 থেকে 3 পর্যন্ত চলে। যদি আমরা দুটি সূচককে লেবেল করে iএবং j, অ্যারেটি bদেখতে এমন দেখাচ্ছে:
i= 0 0 0 0 1 1 1 1 2 2 2 2
j= 0 1 2 3 0 1 2 3 0 1 2 3
┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┐
│ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 10 │ 11 │
└────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┘
যা এর মানে হল যে:
>>> b[2,1]
9
আপনি দেখতে পাচ্ছেন যে দ্বিতীয় সূচকটি দ্রুত পরিবর্তিত হয় এবং প্রথম সূচকটি ধীরে ধীরে পরিবর্তিত হয়। আপনি যদি অন্য উপায়ে এটি পছন্দ করেন তবে আপনি orderপ্যারামিটারটি নির্দিষ্ট করতে পারেন :
>>> c = a.reshape((3, 4), order='F')
যার ফলশ্রুতিতে এই অ্যারের সূচিত হয়:
i= 0 1 2 0 1 2 0 1 2 0 1 2
j= 0 0 0 1 1 1 2 2 2 3 3 3
┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┐
│ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 10 │ 11 │
└────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┘
যা এর মানে হল যে:
>>> c[2,1]
5
এটি এখন পরিষ্কার হওয়া উচিত যে অ্যারেটির 1 বা একাধিক আকারের আকারের একটি আকৃতি থাকার অর্থ কী After এর পরে:
>>> d = a.reshape((12, 1))
অ্যারেটি dদুটি সূচক দ্বারা সূচিত হয়, যার প্রথমটি 0 থেকে 11 পর্যন্ত চলে এবং দ্বিতীয় সূচকটি সর্বদা 0:
i= 0 1 2 3 4 5 6 7 8 9 10 11
j= 0 0 0 0 0 0 0 0 0 0 0 0
┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┐
│ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 10 │ 11 │
└────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┘
এবং তাই:
>>> d[10,0]
10
দৈর্ঘ্য 1 এর একটি মাত্রা "মুক্ত" (কিছুটা অর্থে), সুতরাং আপনাকে শহরে যেতে বাধা দেওয়ার কিছুই নেই:
>>> e = a.reshape((1, 2, 1, 6, 1))
এইভাবে সূচিযুক্ত একটি অ্যারে প্রদান করা:
i= 0 0 0 0 0 0 0 0 0 0 0 0
j= 0 0 0 0 0 0 1 1 1 1 1 1
k= 0 0 0 0 0 0 0 0 0 0 0 0
l= 0 1 2 3 4 5 0 1 2 3 4 5
m= 0 0 0 0 0 0 0 0 0 0 0 0
┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┐
│ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 10 │ 11 │
└────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┘
এবং তাই:
>>> e[0,1,0,0,0]
6
দেখুন NumPy অভ্যন্তরীণ ডকুমেন্টেশন কিভাবে অ্যারে প্রয়োগ করা হয় সে সম্পর্কে আরো জানার জন্য।
2. কি করতে হবে?
যেহেতু numpy.reshapeসবেমাত্র একটি নতুন দৃষ্টিভঙ্গি তৈরি হয়েছে, তাই যখনই প্রয়োজন হয় এটি ব্যবহারের বিষয়ে আপনাকে ভয় পাওয়া উচিত নয়। আপনি যখন অন্য কোনও উপায়ে কোনও অ্যারে সূচি দিতে চান তখন এটি সঠিক সরঞ্জাম tool
যাইহোক, একটি দীর্ঘ গণনায় সাধারণত "ডান" আকারের সাথে প্রথম স্থানে অ্যারেগুলি তৈরির ব্যবস্থা করা সম্ভব হয় এবং তাই পুনরায় আকার এবং স্থানান্তর সংখ্যা হ্রাস করুন। তবে প্রকৃত প্রেক্ষাপটটি না দেখে যা পুনরায় আকারের প্রয়োজনের দিকে পরিচালিত করে, কী পরিবর্তন করা উচিত তা বলা শক্ত।
আপনার প্রশ্নের উদাহরণটি হ'ল:
numpy.dot(M[:,0], numpy.ones((1, R)))
তবে এটি বাস্তববাদী নয়। প্রথমত, এই অভিব্যক্তি:
M[:,0].sum()
ফলাফল আরও সহজভাবে গণনা। দ্বিতীয়ত, 0 কলাম সম্পর্কে সত্যিই কিছু আছে? সম্ভবত আপনার যা প্রয়োজন তা হ'ল:
M.sum(axis=0)