• 0

ماذا تعني -1 في reshape في مكتبة numpy؟

يمكن إعادة تشكيل مصفوفة عددية matrix  إلى متجهvector باستخدام التابع reshape مع المدخل -1. لكني لا أعرف ما تعنيه -1 هنا.

على سبيل المثال:

>>> import numpy as np
>>> a = np.matrix([[1, 2, 3, 4], [5, 6, 7, 8]])
>>> b = np.reshape(a, -1)
>>> a
matrix([[1, 2, 3, 4],
        [5, 6, 7, 8]])
>>> b
matrix([[1, 2, 3, 4, 5, 6, 7, 8]])
>>>

لا أعرف ماذا يعني -1 هنا؟

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 1

بناءً على التوثيق الرسمي، يجب أن يتوافق الحجم الجديد للمصفوفة مع الحجم الأصلي لها، فإذا كان رقمًا صحيحًا سيكون الناتج مصفوفة أحادية البعد طولها يساوي هذا العدد. و هذا البعد قد يساوي 1- و في هذه الحالة يستدل على قيمة البعد من طول المصفوفة الأصلية و الأبعاد الأخرى.

فمثلًا:

لنفرض أنه لدينا المصفوفة التالية و التي لها الأبعاد/الشكل 4 * 3 أي 3 صفوف و 4 أعمدة، أي تحوي 12 عنصر

z = np.array([[1, 2, 3, 4],
         [5, 6, 7, 8],
         [9, 10, 11, 12]])

z.shape

(3, 4)

الآن إذا أردنا إعادة تعيين شكلها أو حجمها، سنحتاج أن يكون الشكل/الحجم الجديد متوافق مع الحجم/الشكل الخاص بالمصفوفة الأصلية أي يجب أن يكفي لل 12 عنصر. فمثلًا يمكن للحجم الجديد أن يكون 2 * 6 أو 6 * 2 أو 3 * 4 أو 12 * 1 أو 1 * 12 أو ......إلخ.

و في numpy يمكننا ذكر الحجم/الشكل الجديد بالتفصيل أي ذكر عدد الأعمدة و الصفوف التي نريدها و يمكننا أيضًا أن نقوم بتحديد بعد وحيد و نترك لها القرار في البعد الآخر.

كيف ستعرف numpy أننا نريدها أن تقرر هذا البعد؟

يتم ذلك عن طريق تمرير 1- للتابع reshape في مكان البعد الذي نريد منها تحديده، و ستقوم بحساب قيمة هذا البعد بناءً على طول المصفوفة و الأبعاد الأخرى(الأبعاد التي قمنا بذكرها)

مثلًا:

هنا قمنا بتحديد عدد الصفوف على أنه صف وحيد، و تركنا numpy تقرر عدد الأعمدة.

كيق ستقوم بحساب عدد الأعمدة؟

هنا طول المصفوفة هو 12 عنصر (4 * 3) و قمنا بتحديد عدد الصفوف ليكون صف وحيد، إذًا من هاتين المعلومتين استنتجت numpy أن عدد الأعمدة يجب أن يكون 12 عمودًا. "يستخدم هذا المثال إذا كانت البيانات الخاصة بك تحوي sample واحدة"

z.reshape(1, -1)
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12])

و هنا مثال آخر قمنا بتحديد عدد الأعمدة ليكون عمود واحد و تركنا لها حساب عدد الصفوف "يتم استخدام هذا المثال إذا كانت البيانات الخاصة بك تحتوي feature واحد فقط":

z.reshape(-1,1)

array([[ 1],
   [ 2],
   [ 3],
   [ 4],
   [ 5],
   [ 6],
   [ 7],
   [ 8],
   [ 9],
   [10],
   [11],
   [12]])

و في هذا المثال قمنا بتحديد عدد الأعمدة ليكون عمودين تركنا لها حساب عدد الصفوف:

z.reshape(-1, 2)
array([[ 1,  2],
   [ 3,  4],
   [ 5,  6],
   [ 7,  8],
   [ 9, 10],
   [11, 12]])

و لكن هل يمكننا أن نجعل  numpy تقرر قيمة كل الأبعاد؟

الإجابة هي لا، حيث ستلقي numpy خطأ هنا و لن تعمل. حيث أن numpy تسمح لك أن تجعل أحد الأبعاد فقط مجهول"أي تتيح لك أن تترك لها القرار في قيمة بعد واحد فقط"

z.reshape(-1, -1)
ValueError: can only specify one unknown dimension

 

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 1

عندما نريد إعادة تعيين حجم مصفوفة فإننا نقوم باستخدام هذا التابع، مثلاً إذا كانت لديك مصفوفة أحادية ل 20 عنصر يمكنك تحويلها لثنائية لكن يجب أن يكون عدد الأسطر * عدد الأعمدة يساوي 20 وبالتالي نمرر له البعد الأول والثاني اللذين نريد إعادة تعيين أبعاد المصفوفة إليهما، مثلا 5 و 4 أو 10 و 2  حيث أن جداءهما يساوي 20، لكن للاختصار يمكننا أن نمرر البعد الأول او الثاني فقط و البعد الآخر نضع بدلاً منه --1 وبالتالي يفهمها بايثون ويستنتج البعد الآخر من تلقاء نفسه، انظر للأمثلة التالية:

arr=np.arange(20)
arr.shape # (20,)
# هنا أعطى خطأ لأن جداء الأسطر بالأعمدة يجب أن يساوي حجم المصفوفة الأصلية
#arr.reshape(10,5) # ValueError: cannot reshape array of size 20 into shape (10,5)
arr.reshape(10,2) # (10,2)
arr.reshape(2,10) # (2,10)
arr.reshape(4,5) # (4,5)
# هنا سيستنتج البعد الآخر بناءان على فكرة أن الجداء يجب أن يساوي أبعاد المصفوفة الأصلية
arr.reshape(-1,2) # (10,2)
arr.reshape(-1,10) # (2,10)
arr.reshape(4,-1) #(4,5)
# أعطى هنا خطأ لأنه لايوجد عدد تضربه ب6 يعطيك 20
arr.reshape(6,-1) # ValueError: cannot reshape array of size 20 into shape (6,newaxis)

 

تمّ تعديل بواسطة Ali Haidar Ahmad
1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن