将一个整数矩阵在 NumPy 中转换为 0-1 矩阵的编码

4

我有一个大小为n*K的整数矩阵。[注意:它表示从K个分布 (K列)中抽取的样本数量]

a =[[0,1,0,0,2,0],
    [0,0,1,0,0,0],
    [3,0,0,0,0,0],
]

[注意: 在应用程序上下文中,该矩阵基本上表示对于第i行(相似实例),我们从“分布1” (1 \in [0,..K]) 中随机抽取了1个元素(a[0,1] = 1),以及从分布4中随机抽取了2个元素(a[0,4] = 2)].

我需要生成一个0-1矩阵,它代表了相同的整数矩阵,但是所有元素都被替换成1。在这种情况下,它是一个3D矩阵,大小为n*a.max()*K,每个从分布中随机抽取的样本都会在矩阵中标记为1。[注意: 我们需要这个矩阵来与我们的K分布样本矩阵相乘]

输出结果

b = [[[0,1,0,0,1,0], # we don't care if they samples are stack 
      [0,0,0,0,1,0],
      [0,0,0,0,0,0]], # this is the first row representation 
     [[0,0,1,0,0,0],
      [0,0,0,0,0,0],
      [0,0,0,0,0,0]], # this is the second row representation 
     [[1,0,0,0,0,0],
      [1,0,0,0,0,0],
      [1,0,0,0,0,0]], # this is the third row representation 

] 

如何在NumPy中实现这个功能?谢谢!


4
如果我理解正确的话,这段内容与IT有关:(np.arange(1, a.max()+1)[:,None] <= a[:,None]).astype('uint8') - Michael Szczesny
太棒了!!@MichaelSzczesny的解决方案非常有效,非常有创意,请发布答案,这样我就可以关闭这个问题 :) - Pablo
1个回答

0

来自@michael-szczesny的评论

a = np.array([[0,1,0,0,2,0],
             [0,0,1,0,0,0],
             [3,0,0,0,0,0],
            ])
b = (np.arange(1, a.max()+1)[:,None] <= a[:,None]).astype('uint8')

打印(b)

array([[[0, 1, 0, 0, 1, 0],
        [0, 0, 0, 0, 1, 0],
        [0, 0, 0, 0, 0, 0]],

       [[0, 0, 1, 0, 0, 0],
        [0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0]],

       [[1, 0, 0, 0, 0, 0],
        [1, 0, 0, 0, 0, 0],
        [1, 0, 0, 0, 0, 0]]], dtype=uint8)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接