Numpy 温度计编码

2023-11-23

我正在尝试使用 numpy 优化的内置函数来生成温度计编码。温度计编码基本上是生成n如果 1 在给定长度内,则为数量。例如,在 8 长度中,3 将被编码为:

1 1 1 0 0 0 0 0

使用 numpy 根据整数输入生成该向量基本上是切片并设置 1。

stream[:num_ones] = 1

所以我的问题是vector作为输入,生成矩阵输出的最佳方式是什么,例如:

[2 3 4 1]

作为输入应该产生:

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

我当前的解决方案是迭代所需大小的零矩阵,并使用我上面编写的切片方法将所需的元素数量设置为 1。有没有更快的方法让我做到这一点?


我以前从未听说过“温度计编码”,但是当您意识到它与 one-hot 编码如此相似时,很明显您可以使用位移操作来实现这一点:

>>> a = np.array([2, 3, 4, 1], dtype=np.uint8)
>>> print(np.fliplr(np.unpackbits((1 << a) - 1).reshape(-1,8)))
[[1 1 0 0 0 0 0 0]
 [1 1 1 0 0 0 0 0]
 [1 1 1 1 0 0 0 0]
 [1 0 0 0 0 0 0 0]]

Edit:您可以通过处理 8 列块来将这个想法推广到任意大小的整数:

a = np.array([2, 13, 4, 0, 1, 17], dtype=np.uint8)
out = np.empty((len(a), 0), dtype=np.uint8)
while a.any():
    block = np.fliplr(np.unpackbits((1 << a) - 1).reshape(-1,8))
    out = np.concatenate([out, block], axis=1)
    a = np.where(a<8, 0, a-8)

print(out)
[[1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0]
 [1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0]
 [1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0]]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Numpy 温度计编码 的相关文章