اذهب إلى المحتوى
  • 0

تقسيم مصفوفة إلى مصفوفتين في Numpy

Fahmy Mostafa

السؤال

 

هل هناك طريقة لتقسيم مصفوفة ثنائية الأبعاد في numpy إلى مصفوفات ثنائية الأبعاد أصغر؟

أي يكون لدي مصفوفة كالتالي:

[[1,2,3,4], [5,6,7,8]]

وأريد تحويلها إلى التالي:

[[1,2], [3,4], [5,6], [7,8]]

 

لذلك أريد أساسًا تقطيع مصفوفة 2 × 4 إلى مصفوفتين 2 × 2. هل يمكنني عمل ذلك من خلال Numpy؟

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

Recommended Posts

  • 0

يوجد اكثر من طريقة لتقسيم مصفوفة في numpy:

1) اذا كانت المصفوفة احادية الابعاد 1-D:

لو عندنا مصفوفة احادية كالتالي:

array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

يمكن تقسيمها الي 5 مصفوفات متساوية باستخدام الكود:

import numpy as np
np.split(x, 5)

ويكون الناتج:

[array([0, 1]), array([2, 3]), array([4, 5]), array([6, 7]), array([8, 9])]

2) تقسيم مصفوفة في ثناية الابعاد 2-D:

في السؤال المطروح، اذا كان لدينا المصفوفة :

[[1,2,3,4], [5,6,7,8]]

يمكن تقسيمه عن طريق الكود التالي:

X = np.array([[1,2,3,4], [5,6,7,8]])
X_new = np.split(a,2,axis=1)

يمكن كذلك تقسيمها لعدد من المصفوفات غير متساوية الحجم اذا اردنا عن طريق استخدام ال indices:

np.split(X, [2,3,3])

هذا سوف يقسمهم الي 3 مصفوفات، اولهما تحتوي على عنصرين والثانيه والثالثة تحتوي كل منهما على ثلاث عناصر كالتالي:

[array([1, 2]), array([3, 4, 5]), array([6, 7, 8])]

هذا يوفر امكانية التقسيم حتى لقطع غير متساوية وبشكل عام يمكن استخدام np.split كالتالي:

numpy.split(arary, indices, axis=0)
>>>array: ادخال المصفوفة المارد تقسيمها
>>>indices: عدد المصفوفات المراد القسيم اليها، يمكن ايضا ادخال عدد من الارقام (كما في المثال السابق) لتقسيمها لقطع غير متساوية
>>>axis: المحور الذي يراد التقيم عليه، افتراضيا 0 وهو يمثل الصفوف او 1 وهو يمثل الاعمدة

 

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

  • 0

في نمباي يمكنك القيام بذلك من خلال التابع split كالتالي:

import numpy as np
a = np.array([[1,2,3,4], [5,6,7,8]])
a1 = np.split(a,2,axis=1) 

التابع split يقوم بقسّم مصفوفة إلى مصفوفات فرعية متعددة. وله الشكل التالي:

numpy.split(ary, indices_or_sections, axis=0)
# ary: المصفوفة المراد تقسيمها إلى مصفوفات فرعية
# indices_or_sections: التقسيمات. ويقبل عدد صحيح أو مصفوفة ببعد واحد
# axis: تمثل المحورالذي نريد التقسيم على أساسه وافتراضياً يساوي 0

بالنسبة للوسيط الثاني الخاص بالتقسيمات، فإذا كانت التقسيمات عدداً صحيحاً N ، فسيتم تقسيم المصفوفة إلى مصفوفات N متساوية على طول المحور.

 

تم التعديل في بواسطة Ali Haidar Ahmad
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

يجب أن تكون قادرًا على تقسيم المصفوفة إلى "كتل" باستخدام reshape و swapaxes:

def blockshaped(arr, nrows, ncols):
    h, w = arr.shape
    assert h % nrows == 0, "{} rows is not evenly divisble by {}".format(h, nrows)
    assert w % ncols == 0, "{} cols is not evenly divisble by {}".format(w, ncols)
    # إرجاع المصفوفة المقسمة
    return (arr.reshape(h//nrows, nrows, -1, ncols)
               .swapaxes(1,2)
               .reshape(-1, nrows, ncols))

حيث يقوم بتحويل c

c = np.arange(24).reshape((4,6))
print(c)
# [[ 0  1  2  3  4  5]
#  [ 6  7  8  9 10 11]
#  [12 13 14 15 16 17]
#  [18 19 20 21 22 23]]

إلى

print(blockshaped(c, 2, 3))
# [[[ 0  1  2]
#   [ 6  7  8]]

#  [[ 3  4  5]
#   [ 9 10 11]]

#  [[12 13 14]
#   [18 19 20]]

#  [[15 16 17]
#   [21 22 23]]]

 

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

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...