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

السؤال

نشر

 

هل هناك طريقة لتقسيم مصفوفة ثنائية الأبعاد في 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
نشر (معدل)

في نمباي يمكنك القيام بذلك من خلال التابع 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]]]

 

  • 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 وهو يمثل الاعمدة

 

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...