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

السؤال

نشر

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

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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...