python - Numpy 温度计编码

标签 python numpy

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

1 1 1 0 0 0 0 0

使用 numpy 生成基于整数输入的向量基本上是切片和设置 1。

stream[:num_ones] = 1

所以我的问题给出了一个向量作为输入,什么是生成矩阵输出的最佳方式,例如:

[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。有没有更快的方法让我做到这一点?

最佳答案

我以前从未听说过“温度计编码”,但当你意识到它与单热编码如此相似时,你就会清楚地知道你可以使用位移运算来实现这一目标:

>>> 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]]

编辑:您可以通过在 8 列 block 中工作将想法推广到任意大小的整数:

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]]

关于python - Numpy 温度计编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49080613/

相关文章:

python - 在 NumPy 中获取 ndarray 的索引和值

python - 根据单独的 numpy 向量中的值平铺 2D numpy 数组的行

Python全局变量疯狂

python - 如何在 python 中创建自己的 map() 函数

python - 缓慢的 Python 套接字传输

python - 从 NumPy 数组中随机选择单元格 - 无需替换

python - NumPy - 在指定索引后插入一个零数组

python - Scrapy xpath 获取以 < 开头的元素的文本

python - 在使用 DHTML、AJAX 等的网站上使用 Python Mechanize ?

python - 在一张图中同时绘制两个截面强度