【问题标题】:Matlab One Hot Encoding - convert column with categoricals into several columns of logicalsMatlab One Hot Encoding - 将分类列转换为几列逻辑
【发布时间】:2026-01-03 12:00:02
【问题描述】:

上下文

我有大量包含分类的列,所有列都有不同的、无法排序的选择。为了让我的生活更容易分析,我想把它们中的每一个都转换成带有逻辑的几列。例如:

1   GENRE
2   Pop
3   Classical
4   Jazz

...会变成...

1   Pop Classical Jazz
2   1       0      0
3   0       1      0
4   0       0      1

问题

我尝试过使用ind2vec,但这仅适用于数字或逻辑。我也遇到过this,但不确定它是否适用于分类。在这种情况下使用什么函数正确?

【问题讨论】:

    标签: arrays matlab statistics data-analysis


    【解决方案1】:

    如果您想从categorical 向量转换为logical array,可以使用unique 函数生成列索引,然后使用any of the options from this related question 执行编码:

    % Sample data:
    data = categorical({'Pop'; 'Classical'; 'Jazz'; 'Pop'; 'Pop'; 'Jazz'});
    
    % Get unique categories and create indices:
    [genre, ~, index] = unique(data)
    
    genre = 
    
         Classical 
         Jazz 
         Pop 
    
    
    index =
    
         3
         1
         2
         3
         3
         2
    
    % Create logical matrix:
    mat = logical(accumarray([(1:numel(index)).' index], 1))
    
    mat =
    
      6×3 logical array
    
       0   0   1
       1   0   0
       0   1   0
       0   0   1
       0   0   1
       0   1   0
    

    【讨论】:

    • 完美运行,谢谢。就我而言,数据实际上不是分类的,因此我还需要使用cellstr(x) 将其转换为字符串,然后使用categorical(x) 将其转换为分类 - 之后,您的代码完成了这项工作。现在我只需要将它循环超过 200 列。
    • @Sekoul:听起来你的x 是一个字符数组?在这种情况下,您甚至不需要转换为分类。您可以使用cellstr 转换为字符数组的元胞数组,然后将其传递给unique
    • 知道了,谢谢!我将如何将标题添加到每一列?在线回答点使用array2table,然后使用genre var 指定标题。在这里合适吗?
    • @Sekoul: 是的,如果你想要一个表格而不只是一个矩阵,你可以使用array2table(mat, 'VariableNames', genre) 如果genre 是一个字符数组的元胞数组,或者array2table(mat, 'VariableNames', cellstr(genre)) 如果genre是分类的。
    【解决方案2】:

    ind2vec 确实可以处理单元格字符串,您可以调用 cellstr 函数来获取这样的单元格字符串

    这些代码可能会有所帮助(来自this,我只改变了一点)

    data = categorical({'Pop'; 'Classical'; 'Jazz';});
    GENRE = cellstr(data); %change categorical data into cell strings
    [~, loc] = ismember(GENRE, unique(GENRE));
    genre = ind2vec(loc')';
    Gen=full(genre);
    array2table(Gen, 'VariableNames', unique(GENRE))
    

    运行这样的代码将返回:

    ans =

    Classical    Jazz    Pop
    _________    ____    ___
    
    0            0       1  
    1            0       0  
    0            1       0  
    

    您可以调用 unique(GENRE) 来检查类别(在单元格字符串中)。同时,logical(Gen)(或调用 logical(full(genre)))包含您需要的逻辑列。

    附:分类结构可能比单元格字符串快,但 ind2vec 函数不适用于它。 uniqueaccumarray 可能会更好。

    【讨论】:

    • 与上面的回答类似,也是可行的解决方案,谢谢!