• 0

كيفية تسطيح flatten بعض أبعاد مصفوفة صغيرة في Numpy؟

هل هناك طريقة سريعة "للتسوية الفرعية sub-flatten" أو تسطيح بعض الأبعاد فقط في مصفوفة صغيرة؟

على سبيل المثال، إن كان لدي مصفوفة أبعادها (50 ،100 ،25)، فإن أبعاد المصفوفة الناتجة ستكون (5000، 25)

أي تم ضرب بعدين معًأ (100 * 50) = 5000

كيف يمكن القيام بذلك في Numpy؟

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


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

يمكنك القيام بذلك من خلال الدالة reshape هذه الدالة تمكنك من تعديل أبعاد المصفوفة بالشكل الذي تريده، والشرط الوحيد هو أن كون عدد العناصر في المصفوفة الجديدة التي تريد إعادة تشكيلها = عدد العناصر في المصفوفة الأصلية. أي إذا كانت المصفوفة الأصلية مصفوفة أحادية البعد ب 12 عنصر وأردنا تحويلها لمصفوفة ثنائية ببعدين وبالتالي يجب أن يكون ناتج جداء البعد الأول بالثاني =12 وبالتالي يمكن أن نستنتج أن أبعاد المصفوفة الناتجة إحدى الخيارات التالية:

a=np.arange(12)
a.reshape(3,4)
"""
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
"""
a.reshape(4,3)
"""
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11]])
"""
a.reshape(6,2)
"""
array([[ 0,  1],
       [ 2,  3],
       [ 4,  5],
       [ 6,  7],
       [ 8,  9],
       [10, 11]])
"""
a.reshape(2,6)
a.reshape(4,4) # ValueError: cannot reshape array of size 12 into shape (4,4)

كما أننا يمكننا أن نمرر له بعد واحد والبعد الآخر نضع مكانه -1 و هو سيستنتجه تلقائياً وفقاُ لمعادلة الجداء:

a=np.arange(12)
a.reshape(-1,4) # سيستنتج أنه3
"""
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
"""

الآن بالتأكيد أصبحت تستطيع معالجة مشكلتك، حيث يمكنك التلاعب بشكل الإخراج بالشكل الذي تريده:

arr = np.ones((50,100,25))
arr.shape
# (50, 100, 25)
arr1=arr.reshape(-1,50) # 100*25
arr1.shape
#(2500, 50)
arr2=arr.reshape(-1,25) # 100*50
arr2.shape
#(5000, 25)
arr3=arr.reshape(50,-1) # 100*25
arr3.shape
#(50, 2500)
arr4=arr.reshape(100,-1)
arr4.shape
# (100, 1250)
arr5=arr.reshape(-1,100)
arr5.shape
#(1250, 100)

أو مثلاً لو لدينا مصفوفة ب 4 أبعاد:

arr = np.ones((50,100,25,4))
arr.shape
#(50, 100, 25, 4)
arr1=arr.reshape(-1,50) # 100*25*4
arr1.shape
# (10000, 50)
arr2=arr.reshape(50,100,-1) # 25*4
arr2.shape
#(50, 100, 100)

وهكذا..

 

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

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


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

بالإضافة للشرح الوافي ل reshape كما في التعليق السابق ولكن إذا كانت هناك العديد من الأبعاد

وتحتاج عمل flat للكل عدا البعد الأخير يمكنك استخدام الحل التالي

arr = numpy.zeros((50,100,25))
new_arr = arr.reshape(-1, arr.shape[-1])
new_arr.shape

# (5000, 25)

أو مثلاً عدا آخر بعدين 

arr = numpy.zeros((3, 4, 5, 6))
new_arr = arr.reshape(-1, *arr.shape[-2:])
new_arr.shape
# (12, 5, 6)

لاحظ مثال آخر

arr = numpy.zeros((3, 4, 5, 6, 7, 8))
new_arr = arr.reshape(*arr.shape[:2], -1, *arr.shape[-2:])
new_arr.shape
# (3, 4, 30, 7, 8)

 

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

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


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

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

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

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


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

تسجيل الدخول

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


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