-
المساهمات
1068 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
43
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو Ali Haidar Ahmad
-
التجريد Abstract: هناك حالات نحتاج فيها أن نعرف صف يمثل فكرة مجردة بدون تعريف كامل لطرائق هذا الصف، مثلاً قد يطلب منا تعريف صفوف تمثل مركبات متعددة مثل سيارات أو طائرات أو شاحنات أو دراجات نارية. في هذه الحالة يكون الحل الأمثل هو تعريف صف يمثل فكرة مجردة وهذه الفكرة هنا هي "المركبة" فكل المركبات تشترك بأنها تتحرك ولكن حركة الطائرة تختلف عن حركة القطار مثلاً. إذاً نقوم بتعريف الصف المجرد الذي يمثل المركبة ونعرف ضمنه طريقة مجردة تعبر عن حركة المركبة، وبعدها نستطيع وراثة مركبات متعددة من هذا الصف، فمثلاً يمكننا وراثة صف يمثل قارب ونقوم بتعريف طريقة الحركة فيه على أنها حركة في الماء ونستطيع تعريف صف يمثل طائرة تكون طريقة الحركة فيه هي الحركة في السماء وهكذا.. نعرف الصف المجرد بالشكل: abstract class class_name{...} كما يجب أن تعلم أن الصفوف المجردة يمكن أن تحوي داخلها طرائق مجردة ويمكن أن لاتحوي أي طريقة مجردة، حيث أننا نقوم عن طريقة ما أنها طريقة مجردة إذا كانت بدون جسم (أي بدون كتلة تحقيق) أي لاتملك أي تعريف Implementation: abstract public void function(); #abstract لاحظ أنها بلا جسم+نضع بدايتها الكلمة أيضاً يجب أن تعلم أنه في حال كان الصف يحوي طريقة مجردة فيتوجب أن يكون هذا الصف مجرد أيضاً. والصف المجرد لايمكن أخذ كائنات منه، حيث يمكننا فقط وراثته، وعند وراثته يجب أن نقوم بتحقيق كل الطرق الموجودة فيه Implementation. abstract class vehicle{ abstract void motion(); } # نقوم بوراثته class car extends vehicle{ void motion(){ System.out.print("The car uses wheels to walk on the roads"); } } # class plane extends vehicle{ void motion(){ System.out.print("fly in the sky"); } } وأخيراً، يمكننا أن نعرف ضمن الصف المجرد باني لكن كما نعلم أن الباني لايمكن وراثته وإنما يمكننا فقط استدعاؤه من خلال الصفوف الأبناء. كما أنه لايمكن أن يكون الباني مجرداً لأنه بالأصل لاتتم وراثته. أيضاً يتوجب على الصف الذي يرث الصف المجرد (مثلاً car) أن يحقق كل الطرق المجردة في الصف المجرد (vehicle) وإلا سيكون هو مجرد أيضاً (صف مجرد يرث صف مجرد). الواجهات Interfaces : هي بنية شبيهة بالصف وشبيها جداً بال Astract Class. ويمكن أن تحتوي على ثوابت وطرق مجردة فقط. يمكن تشبيه الواجهة بصف مجرد كل طرقه مجردة. ولتعريفها: interface Interface_name{ ... } لايمكننا أخذ كائن من الواجهة، وإنما يتم تحقيق طرائقها من خلال صف يقوم بتحقيقها من خلال الكلمة المحجوزة implements عوضاً عن الكلمة extends التي تعبر عن الوراثة. (الانترفيس يتم تحيقها وليس وراثتها). interface Face{...} class A imlements Face{...} الآن الصف A يحقق الواجهة Face وبالتالي يجب أن نعرف كل طرائق الواجهة Face في الصف A. كما يمكن للصف أن يحقق أكثر من واجهة. interface i1 { } interface i2 { } class A implements i1, i2 { } يستطيع الإنترفيس أن يرث من إنترفيس أو أكثر. أي يستطيع الإنترفيس أن يفعل extends لإنترفيس أو أكثر. interface i1 { } interface i2 { } interface i3 extends i1, i2 { } يمكن للصف أن يرث صف ويحقق واجهة أو أكثر: interface i { } class A { } class B extends A implements i { } Nested Interfaces: interface i1 { interface i2 { interface i3 { } } } class A implements i1 { } //i1 يحقق الواجهة A الكلاس class B implements i1.i2 { } //i2 هنا يحقق الواجهة class C implements i1.i2.i3 { } // i3 يمكن أن تحتوي الواجهة على مايلي: دوال لا تملك body, أي Abstract Method. متغيرات مع إعطائهم قيمة بشكل مباشرةً عند تعريفهم. لأن أي متغير تقوم بتعرفه بداخل الإنترفيس يعتبر معرف كـ public final static بشكل تلقائي. Nested Classes, أي كلاس نوعه static بداخل كلاس نوعه static كما يمكن أن يحوي على Nested Interfaces أي إنترفيس بداخل إنترفيس. والإنترفيس يعتبر دوماً public.
- 3 اجابة
-
- 1
-
يمكننا القيام بذلك من خلال groupby: #################################### التجميع على أساس عمود ################################ df = pd.DataFrame({'Animal': ['Falcon', 'Falcon', 'Parrot', 'Parrot'], 'Max Speed': [380., 370., 24., 26.]}) df """ Animal Max Speed 0 Falcon 380.0 1 Falcon 370.0 2 Parrot 24.0 3 Parrot 26.0 """ # التجميع حسب اسم الحيوان ثم تطبيق المتوسط الحسابي على القيم المجمعة df.groupby(['Animal']).mean() """ Max Speed Animal Falcon 375.0 Parrot 25.0 """ أو المجموع لو أردت: df.groupby(['Animal']).sum() """ Max Speed Animal Falcon 750.0 Parrot 50.0 """ التجميع على أساس أكثر من عمود: df = pd.DataFrame({'Animal': ['Falcon', 'Falcon', 'Parrot', 'Parrot'], 'behaviour': ['carnivorous', 'carnivorous', 'vegetarian', 'vegetarian'], 'Max Speed': [380., 370., 24., 26.]}) # التجميع حسب اسم الحيوان وسلوكه ثم تطبيق المتوسط الحسابي على القيم المجمعة df.groupby(['Animal',"behaviour"]).mean() """ Max Speed Animal behaviour Falcon carnivorous 375.0 Parrot vegetarian 25.0 """
-
المرور على أسطر الداتافريم هو فكرة سيئة دوماً... أي دالة تحوي كلمة iter في اسمها حاول الابتعاد عنها قدر المستطاع (حدد سبب رغبتك في استخدامها ثم حاول أن تستخدم طرق أخرى) لأنها ستجعلك تنتظر جداً عندما يكون حجم الداتافريم أكبر من 1000. وبكافة الأحوال سأعرض لك الطرق المتاحة لتنفذ طلبك. إضافة للطريقة التي قدمها أحمد هناك DataFrame.itertuples: for row in df.itertuples(index=True, name='Pandas'): print(row.c1, row.c2) مثال: # importing pandas as pd import pandas as pd # sample dataframe df = pd.DataFrame({ 'A': [1, 2, 3], 'B': ['a', 'b', 'c']}) df """ A B 0 1 a 1 2 b 2 3 c """ for row in df.itertuples(index=True, name='Pandas'): print(row.A, row.B) """ 1 a 2 b 3 c """ عموماً هي أسرع من iterrows بكثير. كما ويمكنك استخدام iloc: # importing pandas as pd import pandas as pd # sample dataframe df = pd.DataFrame({ 'A': [1, 2, 3], 'B': ['a', 'b', 'c']}) df """ A B 0 1 a 1 2 b 2 3 c """ for i in range(0, len(df)): print (df.iloc[i]['A'], df.iloc[i]['B']) """ 1 a 2 b 3 c """
- 2 اجابة
-
- 1
-
الحشو padding هو الآلية التي ستتبعها الخوارزمية أثناء عملية ال convolution (الالتفاف) على المصفوفة للتعامل مع حدود المصفوفة. ففي حالة قمت بضبطها على Valid فهذا يعني أن الخوارزمية قد تتجاهل حدود المصفوفة، مثلاً إذا كان حجم الخطوة strides هو2 وأبعاد المصفوفة 3*2 سيتم تجاهل العمود الثالث من المصفوفة ولن يدخل في الخوارزمية (فقدان معلومات). لأن حجم الخطوة هو بكسلين وبالتالي لن تستطيع معالجة هذا العمود لوحده لذا تتجاهله ، وطبعاً تكون أبعاد المصفوفة الناتجة أقل دوماً. أما في حالة وضعته على SAME فستقوم الخوارزمية بإضافة عمود جديد إلى اليمين وستضبط قيمه بأصفار (حشو padding) وبالتالي ستصبح المصفوفة 4*2 وبالتالي سيتم أخذ كل الأعمدة بعين الاعتبار وفي هذه الحالة ستكون أبعاد المصفوفة الناتجة هي نفس أبعاد المصفوفة الأصلية (عندما يكون حجم الخطوة 1 ينتج نفس الأبعاد) أو أقل. المعادلة التالية تحدد الأبعاد الناتجة في حالة استخدام VALID: output_shape = math.floor((input_shape - ksize) / strides) + 1 (when input_shape >= ksize) أما في حالة استخدمت same فسوف يقوم بعملية الحشو. والمصفوفة الناتجة في هذه الحالة: output_shape = math.floor((input_shape - 1) / strides) + 1 إليك بعض الأمثلة: import tensorflow as tf # تعريف تنسر matrix = tf.constant([ [0, 0, 1, 7], [0, 2, 0, 0], [5, 2, 0, 0], [0, 0, 9, 8], ]) #max_pool ضبط حجمها بالشكل الذي تتوقعه دالة reshaped = tf.reshape(matrix, (1, 4, 4, 1)) ########################## SAME ######################### #على المصفوفة max_pool تطبيق a1=tf.nn.max_pool(reshaped, ksize=2, strides=2, padding="SAME") a1 """ <tf.Tensor: shape=(1, 2, 2, 1), dtype=int32, numpy= array([[[[2], [7]], [[5], [9]]]], dtype=int32)> """ a1.shape # TensorShape([1, 2, 2, 1]) ########################## VAILD ######################### matrix = tf.constant([ [0, 0, 1, 7], [0, 2, 0, 0], [5, 2, 0, 0], [0, 0, 9, 8], ]) matrix = tf.constant([ [0, 0, 1, 7], [0, 2, 0, 0], [5, 2, 0, 0], [0, 0, 9, 8], ]) reshaped = tf.reshape(matrix, (1, 4, 4, 1)) #على المصفوفة max_pool تطبيق a2=tf.nn.max_pool(reshaped, ksize=2, strides=2, padding="VALID") a2 """ <tf.Tensor: shape=(1, 2, 2, 1), dtype=int32, numpy= array([[[[2], [7]], [[5], [9]]]], dtype=int32)> """ a2.shape # TensorShape([1, 2, 2, 1]) مثال آخر، هنا ستبقى المصفوفة بنفس الأبعاد عند استخدام SAME: ########################## SAME ######################### #على المصفوفة max_pool تطبيق a1=tf.nn.max_pool(reshaped, ksize=2, strides=1, padding="SAME") a1 """ <tf.Tensor: shape=(1, 4, 4, 1), dtype=int32, numpy= array([[[[2], [2], [7], [7]], [[5], [2], [0], [0]], [[5], [9], [9], [8]], [[0], [9], [9], [8]]]], dtype=int32)> """ import tensorflow as tf # تعريف تنسر matrix = tf.constant([ [ 0, 1], [ 2, 0] ]) #max_pool ضبط حجمها بالشكل الذي تتوقعه دالة reshaped = tf.reshape(matrix, (1, 2, 2, 1)) ########################## SAME ######################### import tensorflow as tf # تعريف تنسر matrix = tf.constant([ [ 0, 1], [ 2, 0] ]) #max_pool ضبط حجمها بالشكل الذي تتوقعه دالة reshaped = tf.reshape(matrix, (1, 2, 2, 1)) #على المصفوفة max_pool تطبيق a1=tf.nn.max_pool(reshaped, ksize=2, strides=1, padding="SAME") a1 """ <tf.Tensor: shape=(1, 2, 2, 1), dtype=int32, numpy= array([[[[2], [1]], [[2], [0]]]], dtype=int32)> """
- 1 جواب
-
- 1
-
يمكنك أيضاً استخدام DataFrame.apply كالتالي: import pandas as pd df = pd.DataFrame({ 'c1': [1, 2, '6', '8']}) print(df.dtypes) """ c1 object dtype: object """ # التحويل df['c1'] = df['c1'].apply(pd.to_numeric) print(df.dtypes) """ c1 int64 dtype: object """ # pandas.to_datetime نمط البيانات apply ويمكنك أن تمرر للدالة #pandas.to_timedeltaيمكنك أيضاً تمرير كما يمكنك استخدام DataFrame.infer_objects حيث تحاول هذه الطريقة إجراء تحويل بسيط عن طريق استنتاج نوع بيانات الأعمدة من النوع "object". ويتم ترك الأعمدة non-object وغير القابلة للتحويل دون تغيير.: import pandas as pd df = pd.DataFrame({ 'A': [1, 2, 3, 4, 5], 'B': ['a', 'b', 'c', 'd', 'e'], 'C': [1.1, 2.1, 3.0, 4.1, 5.1] }, dtype ='object') print(df.dtypes) """ A object B object C object dtype: object """ # التحويل df = df.infer_objects() print(df.dtypes) """ A int64 B object C float64 dtype: object """ كما ويمكنك أن تستخدم الدالة apply لتغيير نمط بيانات عمود واحد أو عدة أعمدة أو كامل الداتافريم: import pandas as pd df = pd.DataFrame({ 'c1': [4, 5], 'c2': ['k', 'b'], 'c3': [9.1, '7.7'] }) # استخدام قاموس لتحديد الأنماط الجديدة للأعمدة التي نريدها فقط _dict = {'c1': int, 'c3': float } df = df.astype(_dict) print(df.dtypes) """ c1 int64 c2 object c3 float64 dtype: object """ مثال إضافي على هذه الدالة: d = {'c1': [1, 2], 'c2': [3, 4]} df = pd.DataFrame(data=d) """ df.dtypes c1 int64 c2 int64 dtype: object """ # تغيير النمط df.astype('int32').dtypes """ c1 int32 c2 int32 dtype: object """
- 2 اجابة
-
- 1
-
نعم يمكنك القيام بذلك من خلال الكلاس الرائع ImageDataGenerator في تنسرفلو وكيراس. حيث يقوم هذا التابع بتوليد صور جديدة من البيانات الأصلية (يقوم بأخذ صورة ثم يطبق عليها مجموعة من التحويلات مثل زيادة السطوع أو تقليله أو قلب الصورة رأسياً أو أفقياً أو تدويرها أو إزاحة البكسلات . إلخ). وروعته في أنه يقوم بتوليد الصور الجديدة في ال real-time أي بقوم بإنتاجها أثناء تدريب النموذج. وتضمن لك أن النموذج سيتلقى صوراً مختلفة في كل epoch وأيضاً يجب أن تعلم أنه لايقوم بإضافة الصور الجديدة إلى مجموعة البيانات الأصلية (ومن المنطقي جداً حدوث هذا لأنه قد يؤدي إلى ال OF على الصورة). وميزة أخرى لـ ImageDataGenerator هي أنه يتطلب استخدام ذاكرة أقل. حيث يقوم بإنشاء batches بدلاً من توليد كامل مجموعة البيانات ووضعها كلها في الذاكرة. ويمكن إنشائه بالشكل التالي: dataGen=tf.keras.preprocessing.image.ImageDataGenerator( rotation_range=0, width_shift_range=0.0, height_shift_range=0.0, brightness_range=None, shear_range=0.0, zoom_range=0.0, channel_shift_range=0.0, fill_mode="nearest", cval=0.0, horizontal_flip=False, vertical_flip=False, rescale=None, data_format=None, validation_split=0.0 ) هذا الكلاس نحدد له العمليات التي نريد تنفيذها على الصور، فبالنسبة لأول وسيط وهو rotation_range فهو يقوم بتدوير الصورة الأصلية بدرجة معينة نقوم بتحديدها (من 0 إلى 360). لكن عندما يتم تدوير الصورة، ستتحرك بعض وحدات البكسل خارج الصورة وتترك مساحة فارغة يجب ملؤها. يمكنك ملء ذلك بطرق مختلفة مثل القيمة الثابتة "constant" أو أقرب قيم البكسل "nearest" .. إلخ. يتم تحديد هذا في وسيطة fill_mode والقيمة الافتراضية هي "nearest" والتي تقوم ببساطة باستبدال المساحة الفارغة بأقرب قيم للبكسل. أيضاً قد لا يكون الكائن دائماً في وسط الصورة. للتغلب على هذه المشكلة ، يمكننا إزاحة وحدات البكسل في الصورة إما أفقياً أو رأسياً، ويتم ذلك عن طريق إضافة قيمة ثابتة معينة لجميع وحدات البكسل، ويمكننا القيام بذلك من خلال الوسيطة height_shift_range للإزاحة الرأسية و width_shift_range للإزاحة الأفقية للصورة. إذا كانت القيمة رقم float، فسيشير ذلك إلى النسبة المئوية لعرض أو ارتفاع الصورة المراد إزاحتها. بخلاف ذلك ، إذا كانت القيمة عدد صحيح، فسيتم إزاحة العرض أو الارتفاع ببساطة بواسطة قيم البكسل العديدة هذه. يعد قلب الصور أيضاً تقنية رائعة ويمكننا القيام بذلك من خلال الوسيط horizo1ntal_flip و vertical_flip للقلب على طول المحور الرأسي أو الأفقي. ومع ذلك، يجب أن تكون هذه التقنية وفقاً للكائن الموجود في الصورة. على سبيل المثال ، لن يكون القلب الرأسي للسيارة أمراً منطقياً لأنه في البيانات الحقيقية لن يتم اختبار هكذا حالات. أيضاً brightness_range يغير سطوع الصورة بشكل عشوائي. إنها أيضاً تقنية لزيادة البيانات مفيدة للغاية لأن الكائن الخاص بنا لن يكون في حالة إضاءة مثالية في معظم الأوقات. لذلك، يصبح من الضروري تدريب نموذجنا على الصور تحت ظروف الإضاءة المختلفة. ويقبل قائمة من قيمتين عائمتين float ويختار قيمة إزاحة السطوع من هذا النطاق. أيضاً تمثل القيمة 0.0 حالة عدم إضافة أي سطوع بينما القيمة 1.0 تمثل أعظم سطوع. أيضاً يمكنك عمل zoom in و zoom out للصورة من خلال الوسيط zoom_range حيث تعطيه قائمة بقيمتين تحددان الحد الأدنى والحد الأعلى لعملية ال zoom. أو إذا قمت بتحديد قيمة عائمة، فسيتم إجراء التكبير / التصغير في النطاق:[1-zoom_range ، 1 + zoom_range]. أي قيمة أصغر من 1 سيتم تكبير الصورة. في حين أن أي قيمة أكبر من 1 سيتم تصغيرها. أيضاً تسمح لك الوسيطة shear_range بتنفيذ عملية غريبة نوعاً ما فهي تشبه إلى حدما عملية التدوير لكنها تمدد الصورة (تمديد للبكسلات) وأيضاً يجب أن تحدد له درجة لكن هذه الدرجة لاتمثل درجة الدوران وإنما درجة تسمى درجة "القص" أو الميل (ليس لدي فكرة جيدة عنها). أيضاً هناك الوسيطة channel_shift_range التي تسمح لك بتطبيق إزاحة أيضاً لكن على قنوات الصورة. الوسيطة fill_mode كما قلنا من أجل تحديد الآلية التي سيتم فيه تعويض البكسلات التي انتقلت (تغير مكانها). أما cval فتستخدم مع fill mode في حالة اخترنا التكنيك constant وذلك من أجل تحديد القيمة التي نريد التعويض بها (قيمة float طبعاً). أما الوسيطة rescale فهي تمنحنا القدرة على عملي standaraization للصورة (توحيد قيمها لتكون ضمن المجال 0 ل 1) وهذه العملية ضرورية دوماً. أما الوسيط data_format فهو لتحديد ترتيب أبعاد الصورة أي لتحديد فيما إذا كانت القناة هي أخر بعد "channels_last" أو أول بعد"channels_first" . أما الوسيط الأخير فيسمح لنا بأخذ جزء من البيانات ك validation data. الآن بعد أن تقوم بتحديد هذه الوسطاء لباني الصف هذا، كل ماعليك فعله هو استخدام التايع flow_from_directory لقراءة الصور مباشرةً من المجلد وتنفيذ ال augmantaion أثناء تدريب الشبكة العصبية على بيانات التدريب. ويتوقع التابع أن الصور التي تنتمي إلى فئات مختلفة موجودة في مجلدات مختلفة ولكنها داخل نفس المجلد الأصلي. وهذا التابع له الشكل التالي: ImageDataGenerator.flow_from_directory( directory, # المسار الخاص بالمجلد target_size=(256, 256), # حجم الصور color_mode="rgb", # النمط "grayscale", "rgb", "rgba". Default: "rgb" classes=None, # الفئات ويمكنك تحديدها أولا أي أنه اختياري ['dogs', 'cats'] مثلاً class_mode="categorical", batch_size=32, # حجم الباتش للبيانات shuffle=True, # خلط البيانات أو لا save_to_dir=None, # إذا اردت الاحتفاظ بالصور التي تم توليدها ضع له مسار مجلد ليحفظها فيهم save_format="png", # الامتداد الذي تريد حفظ الصور فيه في حال أردت حفظها follow_links=False, subset=None, interpolation="nearest", # تحديد الطريقة التي سيتم فيها تصغير الصورة في حالة كانت أكبر من الحجم المحدد أو أصغر منه ) بالنسبة للوسيط subset يجب أن تحدد في هذه الوسيطة إما ("training" أو "validation") وذلك في حالة كنت قد حدد جزءاً من البيانات ك validation في باني الكلاس. أما class_mode فهو يحدد نوع البيانات التي لديك أي binary أي أن لديك فئتين وبالتالي سيكون لدينا 1D binary labels، أو categorical سيكون لدينا 2D one-hot encoded labels أو sparse سيكون 1D integer labels. أو None وبالتالي هنا لن يقوم بتوليد ال labels للصور لن ينتج عن المُنشئ سوى مجموعات من بيانات الصورة ، وهو أمر مفيد للاستخدام مع model.predict ()). الآن دعنا نرى تطبيقاً عملياً: from keras.models import Sequential from keras.layers import Dense,Conv2D,Dropout,MaxPooling2D,Flatten from keras.preprocessing.image import ImageDataGenerator import cv2 import numpy as np from keras.preprocessing.image import ImageDataGenerator from keras.models import Sequential from keras.layers import Conv2D, MaxPooling2D from keras.layers import Activation, Dropout, Flatten, Dense from keras import backend as K ######################################### obj = ImageDataGenerator( rescale=1. / 255, shear_range=0.2, zoom_range=0.2, horizontal_flip=True) train_generator = obj.flow_from_directory( '/content/safe/train', target_size=(img_width, img_height), batch_size=batch_size, class_mode='binary') # validation data val_datagen = ImageDataGenerator(rescale=1. / 255) validation_generator = val_datagen.flow_from_directory( '/content/safe/val', target_size=(img_width, img_height), batch_size=batch_size, class_mode='binary') """ Found 2039 images belonging to 2 classes. Found 384 images belonging to 2 classes. """ print(train_generator.class_indices) # {'ClosedFace': 0, 'OpenFace': 1} # Number of Training and Validation Samples nb_train_samples = 2039 nb_validation_samples = 384 ################################## Bulding Model ###############################3 #Instantiation model = Sequential() #1st Convolutional Layer model.add(Conv2D(32, (3, 3), input_shape=(100,100,3))) model.add(Activation('relu')) model.add(MaxPooling2D(pool_size=(2, 2))) #2nd Convolutional Layer model.add(Conv2D(32, (3, 3))) model.add(Activation('relu')) model.add(MaxPooling2D(pool_size=(2, 2))) #3rd Convolutional Layer model.add(Conv2D(64, (3, 3))) model.add(Activation('relu')) model.add(MaxPooling2D(pool_size=(2, 2))) #Passing it to a Fully Connected layer model.add(Flatten()) # 1st Fully Connected Layer model.add(Dense(64)) model.add(Activation('relu')) # Add Dropout to prevent overfitting model.add(Dropout(0.5)) #Output Layer model.add(Dense(1)) model.add(Activation('sigmoid')) # compile model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy']) # Fitting epochs = 15 batch_size = 16 model.fit_generator( train_generator, steps_per_epoch=nb_train_samples // batch_size, epochs=15, validation_data=validation_generator, validation_steps=nb_validation_samples // batch_size) #fit أيضاً يمكنك استخدام الدالة أيضاً في حالة كانت بياناتك موجودة ضمن Dataframe يمكنك استخدام flow_from_dataframe بنفس الطريقة مع اختلاف بسيط وهو تمرير الداتافريم الخاص بك وتحديد العمود الذي يحوي أسماء الملفات والعمود الذي يحوي ال labels: ImageDataGenerator.flow_from_dataframe( dataframe, directory=None, x_col="filename", y_col="class", weight_col=None, target_size=(256, 256), color_mode="rgb", classes=None, class_mode="categorical", batch_size=32, shuffle=True, seed=None, save_to_dir=None, save_prefix="", save_format="png", subset=None, interpolation="nearest", validate_filenames=True, )
-
يمكنك استخداك الدالة apply كما أشار أحمد وبطرق عديدة، أولاً في حالة كان التابع الخاص بك يمرر له أكثر من قيمة أو كنت تحتاج لتطبيق تابع يستخدم قيم الأعمدة الأخرى لإنشاء عمود جديد، فيمكنك استخدام lambda مع Apply كالتالي: # Import pandas package import pandas as pd # تعريف تابع # هذا التابع نمرر له عددين ويقوم بجمعهما def add(v1, v2): return v1 + v2 # تعريف داتافريم data = { 'c1':[1, 2, 3], 'c2':[4, 5, 6] } df = pd.DataFrame(data) # طباعته print("Original DataFrame:\n", df) # تطبيق التابع السابق على كل سطر من أسطر الداتا، بحيث يقوم بجمع كل قيمتين متقابلتين من أعمدة الداتا ويخزنهما في عمود جديد #lambda قمنا باستخدام الدالة df['add'] = df.apply(lambda row : add(row['c1'],row['c2']), axis = 1) print('\nAfter Applying Function: ') # النتيجة print(df) """ Original DataFrame: c1 c2 0 1 4 1 2 5 2 3 6 After Applying Function: c1 c2 add 0 1 4 5 1 2 5 7 2 3 6 9 """ #sumكما أنه كان بإمكانك استخدام الدالة df['add'] = df.apply(np.sum, axis = 1) كما يمكنك استخدام الدالة np.vectorize وهي سريعة جداً وأسرع بكثير من الدالة السابقة ويمكنك استخدامها بالشكل الذي تريده بدون الحاجة ل lambda: # Import pandas package import pandas as pd import numpy as np # تعريف تابع def add(v1,v2): return v1 + v2 # تعريف داتافريم data = { 'c1':[1, 2, 3], 'c2':[4, 5, 6] } df = pd.DataFrame(data) print("Original DataFrame:\n", df) df['add'] = np.vectorize(add)(df['c1'], df['c2']) print('\nAfter Applying Function: ') print(df) """ Original DataFrame: c1 c2 0 1 4 1 2 5 2 3 6 After Applying Function: c1 c2 add 0 1 4 5 1 2 5 7 2 3 6 9 """
- 2 اجابة
-
- 1
-
يمكنك أيضاً بدلاً من تعطيل القيد الخاص بك، قم بتعديله بشكل دائم إلى ON DELETE SET NULL. سيؤدي ذلك إلى تحقيق شيء مماثل ولن تضطر إلى تشغيل التحقق من المفاتيح وإيقاف تشغيله: //تخلص من القيود الحالية ALTER TABLE t1 DROP FOREIGN KEY fk_name1; ALTER TABLE t2 DROP FOREIGN KEY fk_name2; ALTER TABLE t1 //أضف القيد ADD FOREIGN KEY (table2_id) REFERENCES table2(id) ON DELETE SET NULL ALTER TABLE t2 ADD FOREIGN KEY (table1_id) REFERENCES table1(id) ON DELETE SET NULL //إضافة قيود أخرى
- 2 اجابة
-
- 1
-
نعم يمكنك تخصيص نسبة من حجم ال GPU أثناء إنشاء الجلسة tf.session، ليتم استخدامها فقط. ويتم ذلك عن طريق تمرير tf.GPUOptions كجزء من وسيطة config، كالتالي: gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.25) sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options)) حيث افترضنا أن لديك gpu ب 8 جيجابايت، وخصصنا 2 جيجا فقط منها لتكون متاحة خلال الجلسة.
- 1 جواب
-
- 1
-
عذراً لم أنتبه أنك تريد قراءة 8 بايتات ظننتها بتات، في هذه الحالة يمكنك القيام بذلك كالتالي: f=open("binfile.bin","wb") # تعريف مصفوفة num=[5,10,15,20,25,3,4,1,6] # تحويلها لصيغة ثنائية arr=bytearray(num) # كتابتها في ملف f.write(arr) f.close() ########################################################### with open("binfile.bin", "rb") as f: bytes = f.read(8) while bytes: s='' for i in list(bytes): s+="{0:b}".format(i) print(s) bytes = f.read(8) f.close() """ 101101011111010011001111001 110 """
-
وما الغاية من وضعه ضمن while؟؟؟!
-
إضافة للتابع الذي قدمه الأستاذ أحمد، يمكنك استخدام مفهوم ال Slicing (نفسه الذي نستخدمه مع المصفوفات): import pandas as pd dic1 = {'c1': ['55', '44', '33', '22'], 'c2': ['1', '2', '3', '4']} df1 = pd.DataFrame(dic1, columns=['c1', 'c2']) print(df1) """ c1 c2 0 55 1 1 44 2 2 33 3 3 22 4 """ # الآن بفرض نريد أخذ الأسطر 1و 2 df1[1:3] """ c1 c2 1 44 2 2 33 3 """ # أول سطرين df1[0:2] """ c1 c2 0 55 1 1 44 2 """ # وهكذا كما ويمكنك استخدام iloc كالتالي: import pandas as pd dic1 = {'c1': ['55', '44', '33', '22'], 'c2': ['1', '2', '3', '4'], 'c3': ['5', '2', '0', '4']} df1 = pd.DataFrame(dic1, columns=['c1', 'c2',"c3"]) # اختيار أسطر محددة df1.iloc[0:2] """ c1 c2 c3 0 55 1 5 1 44 2 2 """ # اختيار أعمدة محددة مع أسطر محددة df1.iloc[1:3, 1:3] """ c2 c3 1 2 2 2 3 0 """ df1.iloc[0:3, 0:2] """ c1 c2 0 55 1 1 44 2 2 33 3 """
- 2 اجابة
-
- 1
-
######################### إنشاء ملف ثنائي ############ # إنشاء ملف ثنائي # w تشير إلى وضع الكتابة # b تشير إلى ملف ثنائي f=open("binfile.bin","wb") # تعريف مصفوفة num=[5, 10, 15, 20, 25] # تحويلها لصيغة ثنائية arr=bytearray(num) # كتابتها في ملف f.write(arr) f.close() ######################### قراءته ############## import pathlib s="" for byte in pathlib.Path("binfile.bin").read_bytes(): # decimal ستقرأ البايت وتحوله ل s+="{0:b}".format(byte) # s نحوله لثنائي مرة أخرى ونضيف ماقرأناه ل print(s) # 101101011111010011001 حيث أن pathlib تسمح لنا بالمرور على الملف بايت بايت.
- 5 اجابة
-
- 1
-
ال epoch هو عملية مرور على كامل بيانات التدريب التي لديك، فمثلاً إذا كان لديك 5000 عينة تدريبية، مقسمة إلى 100 باتش-حزمة- (مفهوم ال Mini-Batches) وبالتالي سيكون لدينا حجم كل باتش batch-size يساوي 50 عينة. هذا يعني أنه عند المرور على كامل البيانات (ال 5000 عينة) سنكون قد قمنا ب 100 iteration أي 100 عملية forward و backward على البيانات (مرور على البيانات ثم تحديث قيم الأوزان في الشبكة). وهذا هو الفرق، ولهذا السبب نستخدم مفهوم ال epoch بدلاً من ال iteration فهو أعم، ونحتاجه في حالة التعامل مع ال Mini-Batches.
- 1 جواب
-
- 2
-
يمكنك تجربة الطريقة التالية التي تحتفظ بجميع التوابع لمجموعات الاستعلامات "querysets": #أو عمليات مشابهة order_by هذه الطريقة ممتازة في حال أردت القيام ب matches = pages | articles | posts #من نموذجين مختلفين querysets لكن هذه الطريقة لاتعمل في حال كما يمكنك استخدام QuerySet.union: qs = qs1.union(qs2, qs3) لكن إذا أردت تطبيق order_by : qs = qs1.union(qs2.select_related("foreignModel"), qs3.select_related("foreignModel")) qs.order_by("foreignModel__prop1")
- 2 اجابة
-
- 1
-
أولاً logits في الرياضيات هي دالة تقوم بتعيين الاحتمالات [0 ، 1] إلى [-inf ، + inf]. ثانياً لاترتبك من الاسم، ال logits في تنسرفلو هي فقط مخرجات الطبقة الأخيرة من نموذجك وتمت تسميتها بهذا الاسم كون مخرجات الطبقة الأخيرة من النموذج لاتكون قيم احتمالية وإنما تكون قيم من [-inf, +inf] أي أن مجموعها لايساوي 1. وعند تمرير هذه ال logits (مخرجات الطبقة الأخيرة من نموذجك) إلى دالة التنشيط Softmax تصبح قيم هذه ال logits احتمالية أي قيمها بين 0 و 1 ومجموعها كلها يساوي 1. هذا كل شيئ. وفي التوثيق الرسمي لتنسرفلو هذا ماتم شرحه عنها: "هي Tensor غير فارغة " non-empty Tensor " ويجب أن تكون من أحد الأنماط التالية half, float32, float64." الآن بالنسبة ل tf.nn.softmax فهي دالة ال softmax التي نعرفها جميعاً (وفي حال لن تكن على دراية بها يمكنك الذهاب إللى الرابط في الأسفل) : import tensorflow as tf import numpy as np logits = tf.constant(np.array([[.1, .3, .5, .9]])) # الدخل هو قيم غير محدودة print((tf.nn.softmax(logits))) # لاحظ أن الخرج أصبح قيم احتمالية بين 0 و1 # tf.Tensor([[0.16838508 0.205666 0.25120102 0.37474789]], shape=(1, 4), dtype=float64) أما بالنسبة ل tf.nn.softmax_cross_entropy_with_logits فهي تطبق الدالة السابقة على ال logits ثم تطبق cross_entropy على خرجه، أي: <<< افترض أن لديك فهم للانتروبيا المتقطعة في نظرية المعلومات>>> sm = tf.nn.softmax(x) ce = cross_entropy(sm) # وفي تنسرفلو يتم دمج هاتين العمليتين كالتالي tf.nn.softmax_cross_entropy_with_logits(logits, labels, name=None) وتستخدم كدالة تكلفة cost حيث يقيس الخطأ الاحتمالي في مهام التصنيف المنفصلة أي التي تكون فيها الفئات متنافية (كل إدخال في فئة واحدة بالضبط). على سبيل المثال ، يتم تصنيف كل صورة على أنها كلب أو قطة وليس كلاهما. وطبعاً كون الفئات متنافية فهذا لايعني بالضرورة أن تكون احتمالاتها متنافية. وكل مايهمنا هو أن يكون التوزيع الاحتمالي لاحتمالاتها صالحاً (أي مجموع ال label يساوي 1) على سبيل المثال: logits = [[4.0, 2.0, 1.0], [0.0, 5.0, 1.0]] labels = [[1.0, 0.0, 0.0], [0.0, 0.8, 0.2]] tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits=logits) # <tf.Tensor: shape=(2,), dtype=float32, numpy=array([0.16984604, 0.82474494], dtype=float32)> ويجب أن تكون كل من label و logits من نفس الأبعاد أي [batch_size, num_classes]. افرض المثال التالي، لدينا مصفوفتي tensor الأولى هي قيم y_hat ولتكن تساوي y = W*x +b أي الأوزان التدريبية مضروبة بالدخل مجموعة على الانحراف (أي القيم المتوقعة من دون إدخالها في دالة تنشيط أي logits)، وو y_true هي القيم الحقيقية. y_hat = ... # Predicted label, e.g. y = tf.matmul(X, W) + b y_true = ... # True label, one-hot encoded وبالتالي يكون مقدار الخطأ الكلي للانتروبيا المتقطعة يساوي إلى : y_hat_softmax = tf.nn.softmax(y_hat) total_loss = tf.reduce_mean(-tf.reduce_sum(y_true * tf.log(y_hat_softmax), [1])) وهو مايكافئ الدالة التالية في تنسرفلو: total_loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(y_hat, y_true))
- 1 جواب
-
- 1
-
يتم استخدام الدالة replace ولها الشكل التالي: Syntax: DataFrame.replace( old value, new value) مثال: import pandas as pd # إنشاء قاموس dic1 = {'c1': ['55', '44', '33', '22'], 'c2': ['1', '2', '3', '4']} dic2 = {'c1': [ 'e','f', 'g', 'h'], 'c2': ['argentena', 'barca', 'MachineLearning', 'ali']} # تحويلها لداتا فريم df1 = pd.DataFrame(dic1, columns=['c1', 'c2']) df2 = pd.DataFrame(dic2, columns=['c1', 'c2']) # عرض البيانات display(df1) display(df2) """ c1 c2 0 55 1 1 44 2 2 33 3 3 22 4 """ """ c1 c2 0 e argentena 1 f barca 2 g MachineLearning 3 h ali """ # استبدال القيمة 3 في العمود الثاني من الفريم الأول بالقيمةالثانية من العمود الثاني في الفريم الثاني # تحديد القيمة القديمة المراد استبدالها old = df1['c2'][2] # حيث حددنا العمود الثاني والفهرس الذي يقابل القيمة 3 # تحديد القيمة الجديدة new = df2['c2'][1] # تنفيذ عملية الاستبدال df1 = df1.replace(old,new) # عرض النتيجة display(df1) """ c1 c2 0 55 1 1 44 2 2 33 barca 3 22 4 """ # كما يمكنك استبدالها بقيمة أنت تريدها مثلا old = df1['c1'][0] df1 = df1.replace(old,'hsoub') display(df1) """ c1 c2 0 hsoub 1 1 44 2 2 33 barca 3 22 4 """ # كما ويمكننا استبدال عمود بآخر df1['c1'] = df1.replace(df1['c1'],df1['c2']) display(df1) """ c1 c2 0 hsoub 1 1 44 2 2 33 barca 3 22 4 """ كما يمكنك تمرير الوسيط inplace=True في حال أردت أن يتم التعديل على المصفوفة الأصلية بدون إنشاء نسخة.
- 2 اجابة
-
- 1
-
نعم يمكنك استخدام mplot3d من matplotlib، يمكنك الذهاب لتوثيقها وتعلمها لرسم الأشكال التي تريدها، لكن vpy أقوى بكثير
- 3 اجابة
-
- 1
-
هناك 3 طرق:الأولى استخدام Q() objects مع معامل النفي ~: from django.db.models import Q r = QuerySet.filter(~Q(a=True), x=5) والثانية استخدام exclude مع filter: r = Model.objects.exclude(a=True).filter(x=5) والثالثة هي إنشاء custom lookup لكن أولاً عليك إنشاء lookup بنفسك: from django.db.models import Lookup class check(Lookup): #lookup اسم ال lookup_name = 'ne' def as_sql(self, compiler, connection): lhs, lhs_params = self.process_lhs(compiler, connection) rhs, rhs_params = self.process_rhs(compiler, connection) params = lhs_params + rhs_params return '%s <> %s' % (lhs, rhs), params # ثم نقوم بتسجيله from django.db.models import Field Field.register_lookup(check) #في استعلامك __ne lookup الآن يمكنك استخدام results = Model.objects.exclude(a=True, x__ne=5)
- 2 اجابة
-
- 1
-
pip list | grep tensorflow أبسط طريقة من خلال ال IDE التي تعمل عليها (جوبيتر أو سبايدر أو باي شارم..) أو من محرر الأكواد الذي تتعامل معه: import tensorflow as tf print(tf.__version__) أو في النسخ الحديثة من تنسرفلو 2x: import tensorflow as tf print(tf.version.VERSION) أما بالنسبة للنسخ الأقدم: import tensorflow as tf print(tf.VERSION) أو من خلال CLI: # ضع الكود التالي فقط python -c 'import tensorflow as tf; print(tf.__version__)' وإذا كانت هناك نسخ متعددة من Python على النظام ، فاستخدم: python<version> -c 'import tensorflow as tf; print(tf.__version__)' أيضاً يمكنك من خلال pip: pip show tensorflow أو يمكنك استخدام pip list التي تعرض لك كل ماتم تنزيله باستخدام pip install + grep لفلترة النتائج وعرض تنسرفلو فقط (في حالة كنت تستخدم لينوكس) pip list | grep tensorflow في حالة ويندوز فيمكنك قلترة النتائج بالشكل: pip list | findstr "tensorflow" أما إذا كنت قد ثبت تنسرفلو على بيئة افتراضية Virtual Environment: قم أولاً بتفعيل البيئة الافتراضية: virtualenv <environment name> # Linux <environment name>\Scripts\activate # Windows # الآن pip show tensorflow أو من خلال أناكوندا، إذا كنت تعمل عليها: conda list | grep tensorflow conda list | findstr "tensorflow"
- 1 جواب
-
- 2
-
السؤال غير واضح تماماً ..لكن سأفترض أن لديك DataFrame وتريد فرز قيمه تصاعدياً أو تنازلياً. في باندا فإن الأداة الأساسية للفرز هي الدالة sort_values: Series.sort_values(by,axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last', ignore_index=False, key=None) حيث أن الوسيط الأول يقبل str أو قائمة من ال str، ويمثل اسم أو قائمة أسماء للفرز على أساسها، إذا كان المحور= 0 أو "الفهرس" فقد يحتوي على مستويات الفهرس و / أو تسميات الأعمدة، إذا كان المحور 1 أو "الأعمدة" فقد يحتوي على مستويات الأعمدة و / أو تسميات الفهرس. الوسيط الثاني هو المحور الذي سيتم الفرز على أساسه، والوسيط الثالث ascending في حال ضبطه على True سيكون الفرز تصاعدي وإلا تنازلي. الوسيط الرابع inplace في حالة ضبطه على True يتم إجراء التعديل على الداتافريم الأساسي أي لايتم إنشاء نسخة. الوسيط الخامس kind هو خوارزمية الفرز المتبعة، فكما نعلم هناك العديد من خوارزميات الفرز وتختلف عن بعضها في التعقيد الزمني للتنفيذ (السرعة) وهناك عدة خوارزميات تدعمها الدالة وهم:{‘quicksort’, ‘mergesort’, ‘heapsort’, ‘stable’} وبشكل افتراضي تكون quicksort . أما الوسيط السادس فهو na_position يحدد المكان الذي سيتم فيه وضع القيمة nan في حال تواجدت في الداتا، ويأخذ وسيطين first أو last، وافتراضياً last. الوسيط السابع ignore_index في حالة ضبطه على True فسيتم تسمية المحور الناتج 0, 1, …, n - 1. وأخيراً ال key: إذا لم يكن None ، فسيتم تطبيق دالة المفتاح على قيم الداتا قبل الفرز. أي أنه مشابه تماماً للوسيط key الموجود في الدالة sorted: import pandas as pd import numpy as np df = pd.DataFrame({ 'c1': ['A', 'A', 'B', np.nan, 'D', 'C'], 'c2': [5, 4, 1, 7, 9, 4], 'c3': [4, 9, 0, 2, 4, 2], 'c4': ['a', 'B', 'c', 'D', 'e', 'F'] }) df """ c1 c2 c3 c4 0 A 5 4 a 1 A 4 9 B 2 B 1 0 c 3 NaN 7 2 D 4 D 9 4 e 5 C 4 2 F """ # الفرز حسب أول عمود df.sort_values(by=['c1']) # تصاعدي """ c1 c2 c3 c4 0 A 5 4 a 1 A 4 9 B 2 B 1 0 c 5 C 4 2 F 4 D 9 4 e 3 NaN 7 2 D """ df.sort_values(by=['c1']) # تنازلي df.sort_values(by=['c1'],ascending=False) # تصاعدي """ c1 c2 c3 c4 4 D 9 4 e 5 C 4 2 F 2 B 1 0 c 0 A 5 4 a 1 A 4 9 B 3 NaN 7 2 D """ وهكذا يمكنك الفرز بالشكل الذي تطلبه وحسب العمود الذي تريده، كما ويمكنك الفرز على أساس عدة أعمدة بالشكل: df.sort_values(by=['col1', 'col2'])
- 2 اجابة
-
- 1
-
null = True يعين NULL (مقابل NOT NULL) في العمود في قاعدة البيانات الخاصة بك. سيتم تخزين القيم الفارغة لأنواع حقول Django مثل DateTimeField أو ForeignKey على أنها NULL في قاعدة البيانات. يحدد blank ما إذا كان الحقل مطلوباً في النماذج. وهذا يشمل ال admin والنماذج المخصصة الخاصة بك "custom forms". إذا كانت blank = True، فلن يكون الحقل مطلوباً (أي سيقبل القيم الفارغة blank values)، بينما إذا كان False فلا يمكن أن يكون الحقل فارغاً. يكون الجمع بين الاثنين متكرراً جداً لأنه عادةً إذا كنت ستسمح لأحد الحقول بأن يكون فارغاً في النموذج الخاص بك، فستحتاج أيضاً إلى أن تجعل قاعدة البيانات الخاصة بك تسمح بقيم NULL لهذا الحقل. الاستثناء هو CharFields و TextFields، والتي لا يتم حفظها في Django على أنها NULL. يتم تخزين القيم الفارغة في قاعدة البيانات كسلسلة فارغة (""). أمثلة: #يعطي خطأ IntegrityError if blank models.DateTimeField(blank=True) #مسموحة NULL قيم models.DateTimeField(null=True) # ولكن يجب تعبئتها في نموذج من الواضح أن هذين الخيارين ليس لهما معنى منطقي للاستخدام (على الرغم من أنه قد يكون هناك حالة استخدام لـ null = True ، blank = False إذا كنت تريد أن يكون الحقل مطلوباً دائماً في النماذج، وهو اختياري عند التعامل مع كائن من خلال شيء مثل ال shell): models.CharField(blank=True) #"" سيتم تخزين القيم الفارغة ك #مسموحة NULL قيم models.CharField(null=True) #NULL ولكن لن يتم تعيينها على أنها لا يتم حفظ أنواع CHAR و TEXT كـ NULL بواسطة Django ، لذا فإن null = True غير ضروري. ومع ذلك ، يمكنك تعيين أحد هذه الحقول يدوياً إلى None لفرض تعيينه على أنه NULL. إذا كنت تحتاج لذلك لسبب ما.
- 2 اجابة
-
- 1
-
جانغو هو إطار عمل ويب، وهو مجاني ومفتوح المصدر أيضاً، تم بناؤه بلغة بايثون، بهدف تسهيل عمليات تطوير مواقع الويب المعقدة، تم بناء العديد من المواقع الكبيرة باستخدامه وأبرزها: ,theonion,Disqus ،Instagram ،Mozilla ،The Washington Times و Pinterest التي كان لديها أكثر من 70 مليون مستخدم بحلول عام 2013 وغيرهم الكثير. تشير بعض اختبارات الحمل الآن. إلى أنه يمكن دعم 240 طلباً متزامناً (معدل ثابت يبلغ 120 زيارة في الثانية 24 × 7) دون أي تدهور كبير في أداء الخادم. وبالتالي 432000 زيارة في الساعة. لكن زمن الاستجابة للطلبات ليس صغيراً عموماً. لذا فإن الإجابة على سؤالك الثاني هي نعم لكن أيضاً يجب أن تكون قد بنيت تطبيقك بشكل صحيح + كان لديك مايكفي من ال hardware. بالنسبة للسؤال الثالث أيضاً يمكن ذلك لكن الأمر ليس بسيطاً إضافةً إلى أن تصميم قاعدة البيانات أمر بالغ الأهمية في تصميم هكذا مواقع.
-
إضافة للإجابة التي قدمها أحمد يمكنك القيام بذلك كالتالي: months=['January','February','March','April','May','June','July','August','September','October','November','December'] def Convert(lst): res_dct = {lst[i]: i+1 for i in range(0, len(lst))} return res_dct print(Convert(months)) # {'January': 1, 'February': 2, 'March': 3, 'April': 4, 'May': 5, 'June': 6, 'July': 7, 'August': 8, 'September': 9, 'October': 10, 'November': 11, 'December': 12} .أو من خلال الدالة zip: months=['January','February','March','April','May','June','July','August','September','October','November','December'] def Convert(l1): d1=zip(l1,[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]) return dict(d1) print(Convert(months)) # {'January': 1, 'February': 2, 'March': 3, 'April': 4, 'May': 5, 'June': 6, 'July': 7, 'August': 8, 'September': 9, 'October': 10, 'November': 11, 'December': 12} أو zip_longest: from itertools import zip_longest months=['January','February','March','April','May','June','July','August','September','October','November','December'] def Convert(l1): d1=zip_longest(l1,[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]) return dict(d1) print(Convert(months)) """ {'January': 1, 'February': 2, 'March': 3, 'April': 4, 'May': 5, 'June': 6, 'July': 7, 'August': 8, 'September': 9, 'October': 10, 'November': 11, 'December': 12} """