numpy直方图数组

时间:2012-03-07 04:35:55

标签: python numpy

我目前正在处理一个填充了collections.counter对象的2d numpy对象数组 每个计数器基本上都是直方图。

  • 键总是来自一组有限的整数,例如0到1500之间
  • 每个计数器中的项目数量是可变的,大多数都很小但有些项目有每个键

这一切都可以满足我的需求,使用较小的数据集但是数据集大约有5亿个单元格标记,内存使用量大约是120Gb,这有点高。

有趣的是numpy.save将它写入4gb文件,这让我觉得我可以做的更好。

有关如何减少内存使用量的任何建议。

我考虑过一个3d数组,但由于需要保留空数,因此需要更多内存。

我在构造数组时大量使用了counter.update,因此任何方法都需要快速/简洁的方式来获得类似的功能。

创建数据后的访问不是一个大问题,因为每个单元格我可以获得每个键的值 - 不需要字典索引。

下面是一个非常简化的示例,它生成一个与我上面描述的大致类似的小数据集。我的代码会更倾向于每个计数器的密钥更少,每个密钥的计数更高

def counterArray_init(v):
    return collections.Counter([v])

e = np.random.random_integers(0,1500,[10,10])
row_len, col_len = e.shape
counterArray = np.zeros([row_len,col_len], dtype= object)
vinit = np.vectorize(counterArray_init)
counterArray[:,:] = vinit(e)
for row in xrange(1,row_len):
    for col in xrange(0,col_len):
       counterArray[row,col].update(counterArray[row - 1,col])
return counterArray

由于

编辑:我已经意识到在我的小型计数器中使用的键在一个小范围内。上面的随机示例代码不是这种行为的一个很好的例子。 因此,我正在研究使用填充了不同长度int数组的对象数组和一个存储每个int数组的最小键值的单独数组。这似乎是一个奇怪的解决方案,但初始测试看起来只使用了计数器方法使用的大约20%的内存。

3 个答案:

答案 0 :(得分:1)

如果存在大量空计数,则稀疏矩阵表示可能是合适的,其中存储器使用与数组中非空元素的数量成比例。 SciPy对你所看到的内容提供了不错的支持:scipy.sparse

答案 1 :(得分:1)

我肯定会使用3D数组,因为键是整数。特定商品的最大数量是多少?如果它低于255,您还可以将数组的数据类型更改为8位。

答案 2 :(得分:0)

快速测试显示存储元组而不是Counter个对象只能节省大约20%。 (在您的用例中可能值得仔细检查)。如果以普通int数组存储效率更低,那么其他选择也很少。

稀疏数组是一个很好的节省空间,但不提供与普通数组相同的boadcast,它们通常只用于创建或存储数据,然后转换为普通数组进行计算。如果你用常规的python循环来指示你的指标,那么稀疏数组可能是一个很好的解决方案。

numpy.save必须进行某种压缩。压缩对内存中活动使用的数据不太可能有用。您使用的是pyTables还是h5py?您目前如何管理120G数据 - 虚拟内存?