Numpy - 创建序数类别嵌入

Numpy - create ordinal categories embedding

我已经将以下代码写入 one-hot encode 整数列表:

import numpy as np
a = np.array([1,2,3,4])

targets = np.zeros((a.size, a.max()))
targets[np.arange(a.size),a-1] = 1
targets

输出:

array([[1., 0., 0., 0.],
       [0., 1., 0., 0.],
       [0., 0., 1., 0.],
       [0., 0., 0., 1.]])

我想更改代码,以更好地适应我的序数 class 问题,这样输出将是:

array([[1., 0., 0., 0.],
       [1., 1., 0., 0.],
       [1., 1., 1., 0.],
       [1., 1., 1., 1.]])

我怎样才能做到这一点?

看来你需要 tril,它给你下三角。 使用 np.ones() 创建任意大小的数组(就像使用 np.zeros() 一样),然后 运行 通过 np.tril()

import numpy as np
a = np.array([1,2,3,4])

targets = np.ones((a.size, a.max()))
targets = np.tril(targets)
targets

或者更简单,使用tri()

import numpy as np
a = np.array([1,2,3,4])

targets = np.tri(a.size, a.max())
targets

使用broadcasted-comparison-

(a[:,None]>np.arange(a.max())).astype(float)

样本运行-

In [47]: a = np.array([3,1,2,4]) # generic case of different numbers spread across

In [48]: (a[:,None]>np.arange(a.max())).astype(float)
Out[48]: 
array([[1., 1., 1., 0.],
       [1., 0., 0., 0.],
       [1., 1., 0., 0.],
       [1., 1., 1., 1.]])

如果在a中有很多条目并且数字范围很小,我们可以创建所有可能的组合然后用a-offseted one -

索引
np.tri(a.max(), dtype=float)[a-1]

样本运行-

In [79]: a = np.array([3,1,2,4])

In [80]: np.tri(a.max(), dtype=float)[a-1]
Out[80]: 
array([[1., 1., 1., 0.],
       [1., 0., 0., 0.],
       [1., 1., 0., 0.],
       [1., 1., 1., 1.]])