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

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

Amer Abdallah

السؤال

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...