Solved
Contributor
Posts: 21

# 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: 4,240

## 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;

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

## 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;
Regular Contributor
Posts: 168

## 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: 10,770

## 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.