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

السؤال

نشر

لدي مصفوفة 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 العنصر في المصفوفة الثانية.

Recommended Posts

  • 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
  • 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)

 

 

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...