9

我想以空间和时间有效的方式在 Python 中创建一个 2D 二进制(位)数组,因为我的 2D 位数组大约为 1 百万(行)* 50000(0 或 1 的列),而且我将执行按位运算这些巨大的元素。我的数组看起来像:

0 1 0 1
1 1 1 0
1 0 0 0 
...

在 C++ 中,对我来说最有效的方法(空间)是创建一种整数数组,其中每个元素代表 32 位,然后我可以使用移位运算符和按位运算符进行运算。

现在我知道python中有一个bitarray模块。但我无法使用位数组列表创建二维结构。我怎样才能做到这一点?

我在 C++ 中知道的另一种方法是创建一个地图,就像map<id, vector<int> >我可以在上面提到的那样操作向量的地方。我应该在python中使用等效的字典吗?

即使您建议我使用位数组来完成这项任务,如果我能知道是否可以让多个线程在位数组的拼接上操作以便我可以使其成为多线程,那将是很棒的。谢谢您的帮助!!

编辑:

如果需要,我什至可以继续为此创建自己的数据结构。然而,只是想在重新发明轮子之前检查一下。

4

3 回答 3

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 是 2 个集合的并集

于 2012-05-01T10:48:09.773 回答
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)。

我是否可以让多个线程对位数组的拼接进行操作,以便我可以使其成为多线程

这不应该是一个问题,通常需要注意。请记住,由于GIL,您不太可能通过多线程实现性能改进。

于 2012-05-01T10:36:40.233 回答
3

你可以使用numpy吗?

>>> import numpy
>>> A = numpy.zeros((50000, 1000000), dtype=bool)

编辑:似乎不是最节省空间的。使用 50GB(每个布尔值 1 个字节)。有谁知道 numpy 是否有办法使用打包的布尔值?

于 2012-05-01T10:38:03.507 回答