Python / Numpy:将布尔列表转换为unsigned int


问题内容
  1. 什么是最快(或最“ Pythonic”)转换方式
    x = [False, False, True, True]
    

12?(如果有这种方法。)

  1. 如果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。但是我太懒了,无法再次测试所有内容。


编辑
:liori在这里发布了独立测试的结果


问题答案:

从其他各种答案中得出各种想法,这是另一种方法:

sum(1<<i for i, b in enumerate(x) if b)

在我的测试中,这是非常快的-
即使它像疯了一样溢出,也要使用numpy方法处理大量位。我使用liori的测试模块进行测试。我建议的更改使Steve的方法快了一点。但是,如果一次需要进行很多此类转换(且位数不太多),我敢打赌numpy会更快。