• 0

تحويل مصفوفة numpy إلى مصفوفة one-hot ثنائية البعد

لدي مصفوفة 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

من كيراس باستخدام التابع 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.]])
"""

 

تمّ تعديل بواسطة Ali Haidar Ahmad
1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


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

هناك الكثير من الطرق البسيطة التي تؤدي هذا الغرض عن طريق استخدام المكتبات مباشرة منها:

استخدام 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)

 

 

انشر على الشّبكات الاجتماعية


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

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن