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

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

Amer Abdallah

السؤال

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

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)

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

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

Recommended Posts

  • 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]]])

 

تم التعديل في بواسطة عبدالباسط ابراهيم
خطأ إملائي
رابط هذا التعليق
شارك على الشبكات الإجتماعية

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...