我想用空间和时间有效的方式在Python中创建一个2D二进制(Bit)数组,因为我的2D比特阵列大约是1百万(行)* 50000(0或1的列),我也会表现对这些巨大元素的按位运算。我的数组看起来像:
0 1 0 1
1 1 1 0
1 0 0 0
...
在C ++中,对我来说最有效的方式(空间)是创建一种整数数组,其中每个元素代表32位,然后我可以使用移位运算符和逐位运算符来进行运算。
现在我知道python中有一个bitarray模块。但我无法使用位数列表创建2D结构。我怎么能这样做?
我在C ++中知道的另一种方法是创建一个类似map<id, vector<int> >
的地图,然后我可以像上面提到的那样操纵向量。我应该在python中使用等效的字典吗?
即使你建议我使用位数组来完成这项任务,也会很棒。如果我能知道我是否可以在一个bitarray接头上运行多个线程,这样我就可以使它成为多线程。谢谢你的帮助!!
编辑:
如果需要,我甚至可以继续为此创建自己的数据结构。然而,只是想在重新发明轮子之前检查一下。
答案 0 :(得分:5)
根据我的评论,你可以使用套装
0 1 0 1
1 1 1 0
1 0 0 0
可以表示为
set([(1,0), (3,0), (0,1), (1,1), (2, 1), (0,2)])
或
{(1,0), (3,0), (0,1), (1,1), (2, 1), (0,2)}
AND相当于2组的交集 OR是两组的联合
答案 1 :(得分:4)
以下内容如何:
In [11]: from bitarray import bitarray
In [12]: arr = [bitarray(50) for i in xrange(10)]
这将创建一个10x50位数组,您可以按如下方式访问该数组:
In [15]: arr[0][1] = True
In [16]: arr[0][1]
Out[16]: True
请记住,1Mx50K阵列需要大约6GB内存(64位操作系统上需要64位Python)。
我是否可以在一个bitarray接头上运行多个线程,以便我可以使它成为多线程
这应该不是问题,通常需要注意。请记住,由于GIL,您不太可能通过多线程实现性能提升。
答案 2 :(得分:2)
你能用numpy吗?
>>> import numpy
>>> A = numpy.zeros((50000, 1000000), dtype=bool)
编辑:似乎没有最节省空间。使用50GB(每个bool 1个字节)。有没有人知道numpy是否有办法使用打包的bool?