Python / Numpy:将布尔列表转换为unsigned int
问题内容:
- 什么是最快(或最“ Pythonic”)转换方式
x = [False, False, True, True]
进12
?(如果有这种方法。)
- 如果
x
不是numpy.array
傻瓜呢?有特殊的命令吗?
我有一个大型的n×n布尔数组,其中每个n元素行代表一个高维特征向量的单个低维哈希。(在上面的示例中,n
=4。)我想知道答案,以便尽可能地压缩我的数据。谢谢。
编辑 :谢谢您的答复!使用以下测试代码,
t = 0
for iter in range(500):
B = scipy.signbit(scipy.randn(1000,20))
for b in B:
t0 = time.clock()
# test code here
t1 = time.clock()
t += (t1-t0)
print t
…这是我的Thinkpad笔记本电脑上的运行时:
当然,我欢迎任何可能确认或反驳我的数据的独立测试!
编辑
:在下面的答案中,更改int(j)
为j
仍然可以正常运行,但运行速度慢了六倍!然后,如果使用强制转换,则其他答案可能会更快int
。但是我太懒了,无法再次测试所有内容。
问题答案:
从其他各种答案中得出各种想法,这是另一种方法:
sum(1<<i for i, b in enumerate(x) if b)
在我的测试中,这是非常快的-
即使它像疯了一样溢出,也要使用numpy方法处理大量位。我使用liori的测试模块进行测试。我建议的更改使Steve的方法快了一点。但是,如果一次需要进行很多此类转换(且位数不太多),我敢打赌numpy会更快。