Statistical programming, matrix languages, and more

One-Hot Vectors

Accepted Solution Solved
Reply
Contributor mcs
Contributor
Posts: 21
Accepted Solution

One-Hot Vectors

I have an nx1 column vector, each element e_n an integer between 1 and p.  I want to convert it to an nxp matrix with a 1 as the e_nth element of each row and the rest 0.

 

have = {6,9,1,...}

 

want = {0 0 0 0 0 1 0 0 0  ... ,

             0 0 0 0 0 0 0 0 1 ... ,

             1 0 0 0 0 0 0 0 0 ... ,

              ...                             }

 

What's the easiest way to do that?


Accepted Solutions
Solution
‎12-09-2016 03:43 PM
SAS Super FREQ
Posts: 3,478

Re: One-Hot Vectors

[ Edited ]

The easiest way is to use the SUB2NDX function to convert (row,col) subscripts into indices.  You didn't specify the dimensions of the final matrix, so in the following example I used a 10-column matrix. You can modify the dimension as you need to:

 

proc iml;
have = {6,9,1,2};
/* Somewhere you need to specify the columns of want? 
   Is it max(have)? Is is square? */
want = j(nrow(have),10,0);
rows = T(1:nrow(have));
idx = sub2ndx(dimension(want), rows||have);
want[idx] = 1;
print want; 

View solution in original post


All Replies
Solution
‎12-09-2016 03:43 PM
SAS Super FREQ
Posts: 3,478

Re: One-Hot Vectors

[ Edited ]

The easiest way is to use the SUB2NDX function to convert (row,col) subscripts into indices.  You didn't specify the dimensions of the final matrix, so in the following example I used a 10-column matrix. You can modify the dimension as you need to:

 

proc iml;
have = {6,9,1,2};
/* Somewhere you need to specify the columns of want? 
   Is it max(have)? Is is square? */
want = j(nrow(have),10,0);
rows = T(1:nrow(have));
idx = sub2ndx(dimension(want), rows||have);
want[idx] = 1;
print want; 
Frequent Contributor
Posts: 137

Re: One-Hot Vectors

Or how about the 'unique design' trick?

 

proc iml;

have = {6, 9, 1, 6, 2};

want = j( nrow(have), max(have), 0);
want[ , unique(have)] = design(have);

print want;
Super User
Posts: 9,681

Re: One-Hot Vectors

Or use this simple way to get index you need.


proc iml;
have = {6,9,1,2};
want = j(nrow(have),max(have),0);
idx = t(have)+(0:nrow(have)-1)#max(have);
want[idx] = 1;
print want; 
quit;

☑ This topic is SOLVED.

Need further help from the community? Please ask a new question.

Discussion stats
  • 3 replies
  • 330 views
  • 3 likes
  • 4 in conversation