• 0

نسخ مصفوفة Numpy ثنائية الأبعاد إلى مصفوفة ثلاثية الأبعاد، لعدد معين من المرات

أرغب في نسخ مصفوفة ثنائية الأبعاد صغيرة الحجم إلى بُعد ثالث. على سبيل المثال:

import numpy as np
arr = np.array([[1,2],[1,2]])

تحويلها إلى مصفوفة ثلاثية الأبعاد مع نسخ المصفوفة في البعد الجديد. بفرض أنني أريد نسخها ثلاث مرات، يجب أن يكون الناتج كالتالي:

new_arr = np.array([[[1,2],[1,2]],[[1,2],[1,2]],[[1,2],[1,2]]])
# new_arr.shape = (3, 2, 2)

كيف يمكنني أن أقوم بهذا الأمر؟

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

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


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

يمكنك القيام بذلك من خلال الدالة np.repeat بالشكل التالي، حيث تدرج الفهرسة باستخدام np.newaxis بُعدًا ثالثًا جديدًا، نكرره بعد ذلك مع المصفوفة:

import numpy as np
arr = np.array([[1, 2], [1, 2]])
arr.shape # (2,  2)
a = np.repeat(arr[:, :, np.newaxis], 3, axis=2)
arr.shape # (2, 2, 3)
print(a[:, :, 0])
"""
[[1 2]
 [1 2]]
"""
print(a[:, :, 1])
"""
[[1 2]
 [1 2]]
"""
print(a[:, :, 2])
"""
[[1 2]
 [1 2]]
"""
a
"""
array([[[1, 1, 1],
        [2, 2, 2]],

       [[1, 1, 1],
        [2, 2, 2]]])
"""

أو:

import numpy as np
arr = np.array([[1, 2], [1, 2]])
arr.shape # (2,  2)
a = np.repeat(arr[np.newaxis,:, :], 3, axis=0) # حددنا المحور العمودي للتكرار
arr.shape # (2, 2, 3)
print(a[0,:, :])
"""
[[1 2]
 [1 2]]
"""
print(a[1,:, :])
"""
[[1 2]
 [1 2]]
"""
print(a[2,:, :])
"""
[[1 2]
 [1 2]]
"""
a
"""
array([[[1, 2],
        [1, 2]],

       [[1, 2],
        [1, 2]],

       [[1, 2],
        [1, 2]]])
"""

أو من خلال دالة np.broadcast_to حيث أن هذه الطريقة لاتتطلب منك ذاكرة إضافية أبداً:

import numpy as np
arr = np.array([[1, 2], [1, 2]])
arr.shape # (2,  2)
numofrepeats = 3
# إذا أردت التكرار على المحور العمودي
np.broadcast_to(arr,(numofrepeats,)+arr.shape)
"""
array([[[1, 2],
        [1, 2]],

       [[1, 2],
        [1, 2]],

       [[1, 2],
        [1, 2]]])
"""
# على المحور الثالث
np.broadcast_to(arr[...,None],arr.shape+(numofrepeats,))
"""
array([[[1, 1, 1],
        [2, 2, 2]],

       [[1, 1, 1],
        [2, 2, 2]]])
"""

 

تمّ تعديل بواسطة Ali Haidar Ahmad

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


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

يمكن استخدام الدالة repeat، عن طريق تحديد عدد المرات التي تريد تكرارها مسبقا، الكود التالي يوضح كيف تقوم بها:

In [1]: import numpy as np

In [2]: num_repeats = 5

In [3]: a = np.array([[1, 2], [1, 2]])

In [4]: b = np.dstack([a]*num_repeats)

In [5]: b[:,:,0]
Out[5]: 
array([[1, 2],
       [1, 2]])

In [6]: b[:,:,1]
Out[6]: 
array([[1, 2],
       [1, 2]])

In [7]: b[:,:,2]
Out[7]: 
array([[1, 2],
       [1, 2]])

In [8]: b[:,:,3]
Out[8]: 
array([[1, 2],
       [1, 2]])

In [9]: b[:,:,4]
Out[9]: 
array([[1, 2],
       [1, 2]])

In [10]: b.shape
Out[10]: (2, 2, 3)

 

تمّ تعديل بواسطة Ahmed Sharshar

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


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

بالإضافة لاستخدام repeat و broadcast_to يمكنك أيضاً استخدام الدالة np.tile بسهولة حيث تقوم بتحديد ال shape كالتالي

import numpy as np

a = np.array([[1,2],[1,2]])
b = np.tile(a,(3, 1,1))

b.shape
(3,2,2)

b
array([[[1, 2],
        [1, 2]],

       [[1, 2],
        [1, 2]],

       [[1, 2],
        [1, 2]]])

 

تمّ تعديل بواسطة عبدالباسط ابراهيم
خطأ إملائي

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


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

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

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

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


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

تسجيل الدخول

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


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