নপি অ্যারে এবং ম্যাট্রিকের মধ্যে পার্থক্য কী? আমার কোনটি ব্যবহার করা উচিত?


346

প্রতিটি সুযোগসুবিধা এবং অসুবিধেও কি কি?

আমি যা দেখেছি তা থেকে, প্রয়োজনে একজনের বদলে অন্যের প্রতিস্থাপন হিসাবে কাজ করা যেতে পারে, সুতরাং আমি কি উভয়কেই ব্যবহার করা বিরক্ত করব বা তাদের মধ্যে কেবল একটির সাথেই আমার লেগে থাকা উচিত?

প্রোগ্রামের শৈলীটি কি আমার পছন্দকে প্রভাবিত করবে? আমি নাম্পি ব্যবহার করে কিছু মেশিন লার্নিং করছি, সুতরাং সেখানে প্রচুর ম্যাট্রিক রয়েছে, তবে প্রচুর ভেক্টরও রয়েছে (অ্যারে)।


3
উত্তরের ন্যায়সঙ্গত করার জন্য আমার কাছে পর্যাপ্ত তথ্য নেই তবে আমি যে প্রধান পার্থক্যটি বলতে পারি তা হ'ল গুণটির বাস্তবায়ন। একটি ম্যাট্রিক্স ম্যাট্রিক্স / টেনসর গুণকে সম্পাদন করে, যখন একটি অ্যারে উপাদান অনুসারে গুণিত করে।
মাইক আজিয়াক

5
পাইথন ৩.৫ ম্যাট্রিক্স গুণ (পিইপি 465) এর জন্য ইনফিক্স @ অপারেটর যুক্ত করেছে এবং নুমপি 1.10 এটির জন্য সমর্থন যুক্ত করেছে। তাই আপনি যদি পাইথন 3.5+ ব্যবহার করে এবং NumPy 1.10+ হয়, তারপর আপনি শুধু লিখতে পারেন A @ Bপরিবর্তে A.dot(B), যেখানে Aএবং Bআছে 2D ndarrayগুলি। এটি matrixপ্লেইন ndarray, আইএমএইচও এর পরিবর্তে ব্যবহারের মূল সুবিধাটি সরিয়ে দেয় ।
MiniQuark

উত্তর:


4

অফিসিয়াল ডকুমেন্ট অনুসারে, ম্যাট্রিক্স ক্লাস ব্যবহার করা আর পরামর্শ দেওয়া হয় না কারণ এটি ভবিষ্যতে অপসারণ করা হবে।

https://numpy.org/doc/stable/reference/generated/numpy.matrix.html

অন্যান্য উত্তর যেমন ইতিমধ্যে জানিয়েছে যে আপনি NumPy অ্যারে দিয়ে সমস্ত ক্রিয়াকলাপ অর্জন করতে পারেন।


396

নম্পি ম্যাট্রিকগুলি কঠোরভাবে দ্বিমাত্রিক, অন্যদিকে নিম্পী অ্যারে (ন্যাটারে) এন-ডাইমেনশনাল। ম্যাট্রিক্স অবজেক্টগুলি নাদারের একটি সাবক্লাস, তাই তারা নাদারেরির সমস্ত বৈশিষ্ট্য এবং পদ্ধতির উত্তরাধিকারী।

নপি ম্যাট্রিক্সের প্রধান সুবিধা হ'ল তারা ম্যাট্রিক্স গুণনের জন্য একটি সুবিধাজনক স্বরলিপি প্রদান করে: যদি ক এবং বি ম্যাট্রিক হয় তবে a*bতাদের ম্যাট্রিক্স পণ্য।

import numpy as np

a = np.mat('4 3; 2 1')
b = np.mat('1 2; 3 4')
print(a)
# [[4 3]
#  [2 1]]
print(b)
# [[1 2]
#  [3 4]]
print(a*b)
# [[13 20]
#  [ 5  8]]

অন্যদিকে, পাইথন ৩.৫ হিসাবে, নুমপি @অপারেটরটি ব্যবহার করে ইনফিক্স ম্যাট্রিক্সের গুণকে সমর্থন করে , তাই আপনি পাইথন> = 3.5 এ ম্যাট্রিক্স গুণনের একই সুবিধা অর্জন করতে পারবেন n

import numpy as np

a = np.array([[4, 3], [2, 1]])
b = np.array([[1, 2], [3, 4]])
print(a@b)
# [[13 20]
#  [ 5  8]]

উভয় ম্যাট্রিক্স অবজেক্ট এবং নাদারেরাই .Tট্রান্সপোজ ফিরিয়ে দিতে হবে, তবে ম্যাট্রিক্স অবজেক্টে কনজুগেট .Hট্রান্সপোজ এবং .Iবিপরীতের জন্যও রয়েছে।

বিপরীতে, নপি অ্যারে নিয়মিতভাবে নিয়ম মেনে চলে যে অপারেশনগুলি উপাদান অনুসারে প্রয়োগ করা হয় (নতুন @অপারেটর ব্যতীত )। সুতরাং, যদি aএবং bনমলি অ্যারে হয়, তবে a*bউপাদান উপাদান অনুসারে গুণিত করে অ্যারে গঠিত হয়:

c = np.array([[4, 3], [2, 1]])
d = np.array([[1, 2], [3, 4]])
print(c*d)
# [[4 6]
#  [6 4]]

ম্যাট্রিক্স গুণনের ফলাফল পেতে, আপনি np.dot(বা @পাইথন> = 3.5 তে, উপরে বর্ণিত হিসাবে) ব্যবহার করুন:

print(np.dot(c,d))
# [[13 20]
#  [ 5  8]]

**অপারেটর এছাড়াও ভিন্নভাবে আচরণ করবে:

print(a**2)
# [[22 15]
#  [10  7]]
print(c**2)
# [[16  9]
#  [ 4  1]]

যেহেতু aএকটি ম্যাট্রিক্স a**2তাই ম্যাট্রিক্স পণ্যটি প্রদান করে a*a। যেহেতু cএকটি নাদারের, তাই c**2প্রতিটি উপাদান স্কোয়ার এলিমেন্টের সাথে একটি ন্যাডেরিকে প্রদান করে।

ম্যাট্রিক্স অবজেক্ট এবং নাদারেরেগুলির সাথে অন্যান্য প্রযুক্তিগত পার্থক্য রয়েছে ( np.ravelআইটেম নির্বাচন এবং ক্রম আচরণ) এর সাথে করণীয় ।

নাম্পার অ্যারেগুলির প্রধান সুবিধা হ'ল তারা দ্বিমাত্রিক ম্যাট্রিক্সের চেয়ে বেশি সাধারণ । আপনি যখন ত্রি-মাত্রিক অ্যারে চান তখন কী হয়? তারপরে আপনাকে ম্যাট্রিক্স অবজেক্ট নয়, একটি নাদারের ব্যবহার করতে হবে। সুতরাং, ম্যাট্রিক্স অবজেক্টগুলি ব্যবহার করা শেখা আরও কাজ - আপনাকে ম্যাট্রিক্স অবজেক্ট ক্রিয়াকলাপ, এবং নাদার্রে ক্রিয়াকলাপ শিখতে হবে।

ম্যাট্রিক এবং অ্যারে উভয়কেই মিশ্রিত করে এমন একটি প্রোগ্রাম লেখা আপনার জীবনকে কঠিন করে তোলে কারণ আপনার ভেরিয়েবলগুলি কী ধরণের অবজেক্টের তা আপনাকে ট্র্যাক করে রাখতে হবে, পাছে গুণগুলি এমন কোনও প্রত্যাশাকে প্রত্যাশা করে না যা প্রত্যাশা করে না।

বিপরীতে, আপনি যদি পুরোপুরি ndarrays এর সাথে লেগে থাকেন তবে কিছুটা আলাদা ফাংশন / স্বরলিপি বাদ দিয়ে আপনি ম্যাট্রিক্স অবজেক্টগুলি আরও কিছু করতে পারেন এবং আরও অনেক কিছু করতে পারেন।

আপনি যদি নম্পপি ম্যাট্রিক্স প্রোডাক্ট নোটেশনের ভিজ্যুয়াল আপিল (যা পাইথনের ন্যাডেরায়> = 3.5 এর সাথে প্রায় মার্জিতভাবে অর্জন করা যায়) ছেড়ে দিতে রাজি হন, তবে আমি মনে করি নুমপি অ্যারেগুলি অবশ্যই যাওয়ার উপায় definitely

পুনশ্চ. অবশ্যই, আপনি সত্যিই যেহেতু অন্যান্য খরচে একটি বেছে নিন, হবে না np.asmatrixএবং np.asarrayআপনি অন্যান্য এক রূপান্তর করার অনুমতি দেয় (যেমন অ্যারে 2-মাত্রিক হিসাবে দীর্ঘ)।


সেখানে NumPy মধ্যে পার্থক্য একটি সারসংক্ষেপ হয় arraysবনাম NumPy matrixস্প্যানিশ ভাষায় এখানে


7
যারা ভাবছেন তাদের mat**nজন্য , ম্যাট্রিক্সের জন্য reduce(np.dot, [arr]*n)
অ্যারেজিতে অरेজিকভাবে

6
বা কেবলnp.linalg.matrix_power(mat, n)
এরিক

আমি ভাবছি ম্যাট্রিকগুলি আরও দ্রুত হবে কিনা ... আপনি কী ভাবেন যে তারা নাদারের চেয়ে কম চেক করতে হবে?
পাসক্যালভিকুটেন

1
প্রকৃতপক্ষে, টাইমিট পরীক্ষাগুলি ন্যাডেরে অপারেশনগুলি দেখায় যেমনগুলির np.dot(array2, array2)চেয়ে দ্রুত matrix1*matrix2। এটি বোঝা যায় কারণ matrixনাদারের একটি সাবক্লাস যা বিশেষ পদ্ধতিগুলিকে ওভাররাইড করে __mul__matrix.__mul__কলnp.dot । সুতরাং এখানে কোড পুনরায় ব্যবহার আছে। কম চেক সঞ্চালনের পরিবর্তে, matrix*matrixঅতিরিক্ত ফাংশন কল ব্যবহার করে । সুতরাং ব্যবহারের সুবিধাটি matrixবিশুদ্ধভাবে সিনট্যাকটিক, আরও ভাল পারফরম্যান্স নয়।
unutbu

4 * 1 + 3 * 3 আপনাকে 13 দেওয়ার সময় আপনি এনপি.ডট (সি, ডি) করার সময় এটিকে আসলে গণিতে ক্রস প্রোডাক্ট বলে না
পাইরেটএপ

92

Scipy.org আপনাকে অ্যারে ব্যবহার করার পরামর্শ দেয়:

* 'অ্যারে' বা 'ম্যাট্রিক্স'? আমার কোনটি ব্যবহার করা উচিত? - সংক্ষিপ্ত উত্তর

অ্যারে ব্যবহার করুন।

  • এগুলি হ'ল স্ট্যান্ডার্ড ভেক্টর / ম্যাট্রিক্স / টেনসর টাইপের নাম্পি। ম্যাট্রিকেস নয়, অনেকগুলি নালীর ফাংশন রিটার্ন দেয়।

  • উপাদান-ভিত্তিক অপারেশন এবং লিনিয়ার বীজগণিত ক্রিয়াকলাপগুলির মধ্যে একটি স্পষ্ট পার্থক্য রয়েছে।

  • আপনি যদি পছন্দ করেন তবে আপনার কাছে স্ট্যান্ডার্ড ভেক্টর বা সারি / কলাম ভেক্টর থাকতে পারে।

অ্যারে টাইপটি ব্যবহারের একমাত্র অসুবিধা হ'ল আপনাকে দুটি টেনার (স্কেলার প্রোডাক্ট, ম্যাট্রিক্স ভেক্টর গুন ইত্যাদি) গুণনের dotপরিবর্তে ব্যবহার করতে হবে *


11
যদিও গৃহীত উত্তরটি আরও তথ্য সরবরাহ করে, প্রকৃত উত্তরটি সত্যই আঁকড়ে থাকা ndarray। ব্যবহারের জন্য মূল যুক্তিটি matrixহ'ল যদি আপনার কোড লিনিয়ার বীজগণিতের মধ্যে ভারী হয় এবং dotফাংশনে সমস্ত কল সহ কম পরিষ্কার দেখা যায় । তবে এই যুক্তি ভবিষ্যতে অদৃশ্য হয়ে যাবে, এখন ম্যাট্রিক্স গুণনের সাথে @ -রপরেটর গ্রহণের জন্য গৃহীত হয়েছে, পিইপি 465 দেখুন । এটির জন্য পাইথন ৩.৫ এবং নম্পির সর্বশেষতম সংস্করণ প্রয়োজন। ম্যাট্রিক্স ক্লাসটি সুদূর ভবিষ্যতে অবনমিত হতে পারে, তাই নতুন কোডের জন্য নাদারের ব্যবহার করা আরও ভাল ...
বাস সুইঙ্কেলস

6
এই পৃষ্ঠাটি মৃত্তিকা সম্পর্কে scipy.sparseকরুণার সাথে ভুলে যায় । আপনি যদি নিজের কোডে ঘন এবং বিচ্ছিন্ন ম্যাট্রিক দুটি ব্যবহার করেন তবে এটি আঁকড়ে রাখা আরও সহজ matrix
ডেভিড নেমেস্কি

3
আমার মতে, অ্যারেগুলির প্রধান অসুবিধা হ'ল কলামটি স্লাইসিং ফ্ল্যাট অ্যারেগুলি দেয় যা বিভ্রান্তিকর হতে পারে এবং গাণিতিকভাবে সত্যই শোনান। এটি গুরুত্বপূর্ণ অসুবিধার দিকেও নিয়ে যায় যে নম্পি অ্যারেগুলি স্কিপি.স্পার্স ম্যাট্রিক্সের মতো একইভাবে চিকিত্সা করা যায় না যখন নম্পি ম্যাট্রিকগুলি মূলত বিরল ম্যাট্রিকের সাথে অবাধে বিনিময় করা যায়। এই প্রসঙ্গে কৌতূহলযুক্ত যে স্কিপি অ্যারে ব্যবহারের পরামর্শ দেয় এবং তারপরে সুসংগত স্পার্স অ্যারে সরবরাহ করে না।
রেডিও

29

কেবল আনটবুর তালিকায় একটি মামলা যুক্ত করতে।

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

উদাহরণস্বরূপ ম্যাট্রিক্স বা অ্যারের ডিমন সারি:

ম্যাট্রিক্স সহ

>>> m = np.mat([[1,2],[2,3]])
>>> m
matrix([[1, 2],
        [2, 3]])
>>> mm = m.mean(1)
>>> mm
matrix([[ 1.5],
        [ 2.5]])
>>> mm.shape
(2, 1)
>>> m - mm
matrix([[-0.5,  0.5],
        [-0.5,  0.5]])

অ্যারে সহ

>>> a = np.array([[1,2],[2,3]])
>>> a
array([[1, 2],
       [2, 3]])
>>> am = a.mean(1)
>>> am.shape
(2,)
>>> am
array([ 1.5,  2.5])
>>> a - am #wrong
array([[-0.5, -0.5],
       [ 0.5,  0.5]])
>>> a - am[:, np.newaxis]  #right
array([[-0.5,  0.5],
       [-0.5,  0.5]])

আমি আরও মনে করি যে অ্যারে এবং ম্যাট্রিক্সের মিশ্রণ অনেকগুলি "সুখী" ডিবাগিংয়ের সময় দেয়। তবে স্কিপি.স্পার্স ম্যাট্রিক্সগুলি সর্বদা গুণকের মতো অপারেটরের ক্ষেত্রে ম্যাট্রিক হয়।


20

অন্যরা যেমন উল্লেখ করেছে, সম্ভবত এর প্রধান সুবিধাটি matrixহ'ল এটি ম্যাট্রিক্সের গুণনের জন্য একটি সুবিধাজনক স্বরলিপি সরবরাহ করেছিল।

যাইহোক, পাইথন 3.5 সেখানে পরিশেষে ম্যাট্রিক্স গুণ জন্য একটি উদ্দীষ্ট পোতা অপারেটর : @

সাম্প্রতিক NumPy সংস্করণগুলির সাথে, এটি ndarrayএর সাথে ব্যবহার করা যেতে পারে :

A = numpy.ones((1, 3))
B = numpy.ones((3, 3))
A @ B

তাই আজকাল, আরও বেশি, যখন সন্দেহ হয় তখন আপনার আটকে থাকা উচিত ndarray

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