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

إضافة عمود في مصفوفة numpy بقيم عشوائية

Fahmy Mostafa

السؤال

لدي مصفوفة Numpy كبيرة تحتوي على عمودين فقط كالتالي:

a = np.array([
    [1, 2,],
    [3, 4]
	# ...
    ])

كيف يمكنني إضافة عمود لهذه المصفوفة بقيم عشوائية باستخدام Numpy للحصول على أسرع نتيجة؟

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

Recommended Posts

  • 1

هنالك خطوتين في هذا السؤال الأولى هي إنشاء البيانات العشوائية و الثانية هي عملية إضافة العمود أو الأعمدة الجديدة:

import numpy as np

N = 3

a = np.array([[1, 2,],[3, 4]])
b = np.random.random((N,a.shape[1]))

np.ascontiguousarray(numpy.vstack([a, b]).T)

في البرنامج السابق قمنا بإستيراد numpy و من ثم تعريف عدد القيم الجديدة التي نود إضافتها و مناداة الدالة random من مكتبة numpy.random وبعد تمرير الشكل إستخدمنا vstack لإلصاق القيم الجديدة بالمصفوفة a لكن لتسريع العملية إستخدمنا ascontiguousarray والتي تتعامل مع contiguous array في الذاكرة بالتالي فهي أسرع، لاحظ لنتيجة إختبار سرعات الدوال التالية:

VfSeN.png

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

  • 0

يمكنك استخدام append ,تأخذ الدالة append ثلاث معاملات ، الأول والثاني عبارة عن مصفوفات numpy ثنائية الأبعاد والثالث عبارة عن طول المحور المطلوب إلحاقه, ويمكنك استخدامها كالتالي

import numpy as np  
x = np.array([[1,2,3], [4,5,6]]) 
y = np.array([[1], [1]]) 
print(np.append(x, y, axis=1)) 

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

[[1 2 3 1]
 [4 5 6 1]]

 

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

  • 0

يمكنك أن تستخدم التابع random لتكوين مصفوفة أحادية من أرقام عشوائية كالتالي:

import numpy as np
a = np.array([
    [1, 2,],
    [3, 4]
])
x = np.random.rand(a.shape[0], 1)	# array([[0.40956956], [0.45251438]])

يمكنك بعد ذلك إستخدام التابع append لدمج المصفوفتين في مصفوفة واحدة كالتالي:

b = np.append(a, x, axis=1)

"""

Output:
array([[1.        , 2.        , 0.99125393],
       [3.        , 4.        , 0.33360925]])

"""

 

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

  • 0

يمكنك أيضاً استخدام hstack وسيكون كالتالي

أولاً توليد قيم عشوائية 

import numpy as np

a = np.array([
    [1, 2,],
    [3, 4]
])
x = np.random.rand(a.shape[0], 1)

ثانياً إضافة هذه القيم من خلال ال hstack 

b = np.hstack((a, x))

 

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

  • 0

هناك عدة طرق للقيام بذلك، وتختلف باختلاف زمن التنفيذ كما في الرسم البياني الذي قدمته Reem.
إليك أفضل الطرق للقيام بذلك:

import numpy as np
a = np.array([
    [1, 2,],
    [3, 4]
    ])
n=1
b = np.random.random((n,a.shape[1]))
# طريقة1
np.ascontiguousarray(np.vstack([a.T, b]).T)
# طريقة 2
np.c_[a, b.T]
# طريقة 4
# تكديس المصفوفات  في تسلسل عمودي (حسب الصف). 
np.vstack([a.T, b]).T
# 5 طريقة
# سلسلة من المصفوفات على طول محور موجود
np.concatenate([a.T, b]).T
# 6 طريقة
# 1D إضافة مصفوفة
# يتم إضافتها كعمود
np.column_stack([a, b.T])
# 7 تكديس المصفوفات في تسلسل أفقي أي حسب الصف
np.hstack([a, b.T])
#append و insert يمكن أيضاً استخدام التابع
# لكنهما أقل سرعة
# الخرج
"""
array([[1.        , 2.        , 0.11709763],
       [3.        , 4.        , 0.65841792]])
"""

مثال عن concatenate لتوضيح عمله:

# numpy.concatenate((a1, a2, ...), axis=0, dtype=None)
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6]])
np.concatenate((a, b), axis=0)
"""array([[1, 2],
       [3, 4],
       [5, 6]])
"""
np.concatenate((a, b.T), axis=1)
"""array([[1, 2, 5],
       [3, 4, 6]])"""

np.concatenate((a, b), axis=None)
"""array(
[1, 2, 3, 4, 5, 6]
)"""

استخدام hstack و vstack يبدو الحل الأسرع (التخزين بشكل contiguous أي تخزين المصفوفات بشكل متجاور بشكل عام بعتبر أسرع من ناحية إجراء العمليات عليه لكن هذه الطرق-أقصد stack بأنواعها- لاتخزن المصفوفات بشكل متجاور، لذا نستخدم التابع ascontiguousarray لتحويلها لكن هذا سيكلفنا المزيد من الوقت وهذا مايتضح لنا في الرسم البياني الذي قدمته Reem، لذا لا أفضله).
أفضل استخدام concat أو column_stack فهو مريح أكثر ومناسب وسرعته مناسبة كما ترى في الرسم البياني الذي أرفقته Reem

 

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

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...