Amer Abdallah نشر 3 أغسطس 2021 أرسل تقرير نشر 3 أغسطس 2021 لدي مصفوفة Numpy بالشكل التالي: a = np.array([1, 0, 3]) كيف يمكنني عمل مصفوفة one-hot ثنائية البعد بالشكل التالي بناءًا على المصفوفة السابقة: array([[0., 1., 0., 0.], # 1 [1., 0., 0., 0.], # 0 [0., 0., 0., 1.]]) # 3 لاحظ أن كل عنصر في المصفوفة الأولى يشير إلى index العنصر في المصفوفة الثانية. اقتباس
1 Ali Haidar Ahmad نشر 3 أغسطس 2021 أرسل تقرير نشر 3 أغسطس 2021 (معدل) من كيراس باستخدام التابع to_categorical import numpy as np a = np.array([1, 0, 3]) from keras.utils.np_utils import to_categorical one_hot_train = to_categorical(a) one_hot_train """ array([[0., 1., 0., 0.], [1., 0., 0., 0.], [0., 0., 0., 1.]], dtype=float32) """ أو يمكنك القيام بذلك من خلال تشكيل تابع: import numpy as np a = np.array([1, 0, 3]) # dimension: أكبر عنصر في بياناتك+1 def vectorize_sequences(sequences, dimension=a[max(a)]+1): results = np.zeros((len(sequences), dimension)) for i, sequence in enumerate(sequences): results[i, sequence] = 1. return results OneHOT = vectorize_sequences(a) OneHOT """ array([[0., 1., 0., 0.], [1., 0., 0., 0.], [0., 0., 0., 1.]]) """ أيضاً بشكل يدوي من خلال استخدام عدة توابع في نمباي : import numpy as np a = np.array([1, 0, 3]) b = np.zeros((a.size, a.max()+1)) b[np.arange(a.size),a] = 1 b أيضاً طريقة أخرى، عبر الاستعانة بتوابع نمباي: import numpy as np a = np.array([1, 0, 3]) def one_hot(a, dimension=a[max(a)]+1): return np.squeeze(np.eye(dimension)[a.reshape(-1)]) one_hot(a) """ array([[0., 1., 0., 0.], [1., 0., 0., 0.], [0., 0., 0., 1.]]) """ يمكنك أيضاً استخدام مكتبة باندا من خلال التابع get_dummies: import numpy as np import pandas a = np.array([1, 0, 3]) one_hot_encode=pandas.get_dummies(a) one_hot_encode """ 0 1 3 0 0 1 0 1 1 0 0 2 0 0 1 """ أو من مكتبة sklearn استخدام التابع OneHotEncoder: import numpy as np import pandas a = np.array([1, 0, 3]) from sklearn.preprocessing import OneHotEncoder enc = OneHotEncoder(handle_unknown='ignore') o=enc.fit_transform(a.reshape(-1, 1)) onehot=o.toarray() onehot """ array([[0., 1., 0.], [1., 0., 0.], [0., 0., 1.]]) """ لكن في آخر طلريقتين سيكون حجم الشعاع لكل قيمة يساوي عدد العناصر المختلفة. أي لن يقوم بعملية تمثيلهم حسب ال index انظر: import numpy as np import pandas a = np.array([1, 0, 4]) from sklearn.preprocessing import OneHotEncoder enc = OneHotEncoder() one_hot = enc.fit_transform(a.reshape(-1, 1)) one_hot.toarray() """ array([[0., 1., 0.], [1., 0., 0.], [0., 0., 1.]]) """ تم التعديل في 3 أغسطس 2021 بواسطة Ali Haidar Ahmad 1 اقتباس
0 Ahmed Sharshar نشر 3 أغسطس 2021 أرسل تقرير نشر 3 أغسطس 2021 هناك الكثير من الطرق البسيطة التي تؤدي هذا الغرض عن طريق استخدام المكتبات مباشرة منها: استخدام numpy كاسهل واسرع طريقة كالتالي: >>> a = np.array([1, 0, 3]) >>> b = np.zeros((a.size, a.max()+1)) >>> b[np.arange(a.size),a] = 1 >>> b array([[ 0., 1., 0., 0.], [ 1., 0., 0., 0.], [ 0., 0., 0., 1.]]) أو يمكن استخدام هذة الطريقة ايضا من numpy كالتالي: >>> values = [1, 0, 3] >>> n_values = np.max(values) + 1 >>> np.eye(n_values)[values] array([[ 0., 1., 0., 0.], [ 1., 0., 0., 0.], [ 0., 0., 0., 1.]]) وطريقة ثالثة من numpy ايضا: import numpy as np num_classes = 5 targets = np.array([[2, 3, 4, 0]]).reshape(-1) one_hot_targets = np.eye(num_classes)[targets] #output array([[[ 0., 0., 1., 0., 0., 0.], [ 0., 0., 0., 1., 0., 0.], [ 0., 0., 0., 0., 1., 0.], [ 1., 0., 0., 0., 0., 0.]]]) حيث أن num_classes يمثل عدد الفئات التي تريد أن يتم ترميزها 3 class تعني قطة وكلب فأر على سبيل المثال. يمكنك أستخدام keras لعمل التحويل كالتالي: from keras.utils.np_utils import to_categorical categorical_labels = to_categorical(int_labels, num_classes=3) اقتباس
السؤال
Amer Abdallah
لدي مصفوفة Numpy بالشكل التالي:
كيف يمكنني عمل مصفوفة one-hot ثنائية البعد بالشكل التالي بناءًا على المصفوفة السابقة:
لاحظ أن كل عنصر في المصفوفة الأولى يشير إلى index العنصر في المصفوفة الثانية.
2 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.