我有一个巨大的文件,第一行是字符串,其他行代表整数。列数是可变的,取决于行。
有一个全局列表,我保存我的中间结果。 arr_of_arr
是浮动列表的列表。 arr_of_arr
的长度约为5000.此数组的每个元素(同样是一个数组)的长度为100.000到10.000.000。元素的最大长度可能会有所不同,因此在创建arr_of_arr时我无法提前扩展每个元素。
在我完成整个文件之后,我人工添加我计算每个全局数组和图的元素的平均值。max_size_arr
是数组中最长元素的长度(我在竞争时竞争它)我遍历文件中的行
arr = [x+[0]*(max_size_arr - len(x)) for x in arr_of_arr]
我需要计算跨数组元素的均值。 例如, [[1,2,3],[4,5,6],[0,2,10]]将导致[5 / 3,9 / 3,19 / 3](跨阵列的第一个元素的平均值,表示数组之间的第二个元素等。)
arr = np.mean(np.array(arr),axis=0)
然而,这会导致巨大的内存消耗(根据群集信息,如100GB)。在减少内存消耗的结构意义上,什么是一个很好的解决方案? numpy数组会比python中的普通数组轻吗?
答案 0 :(得分:1)
我认为巨大的内存消耗是因为你想要将整个数组同时存储在内存中。
为什么不使用与numpy arrays结合的切片?这样做可以模拟数据的批处理。您可以为函数提供批量大小(1000或10000数组),计算均值并将结果写入dict或文件中,指示切片及其各自的方法。
答案 1 :(得分:0)
您是否尝试过使用Numba套餐?它使用标准的numpy数组减少了计算时间和内存使用量。 http://numba.pydata.org
答案 2 :(得分:0)
如果值的数量变化很大,我会坚持列表,只要实际可行。当数据是' row'时,numpy
数组最佳。长度是一样的。
用一个小例子说明:
In [453]: list_of_lists=[[1,2,3],[4,5,6,7,8,9],[0],[1,2]]
In [454]: list_of_lists
Out[454]: [[1, 2, 3], [4, 5, 6, 7, 8, 9], [0], [1, 2]]
In [455]: [len(x) for x in list_of_lists]
Out[455]: [3, 6, 1, 2]
In [456]: [sum(x) for x in list_of_lists]
Out[456]: [6, 39, 0, 3]
In [458]: [sum(x)/float(len(x)) for x in list_of_lists]
Out[458]: [2.0, 6.5, 0.0, 1.5]
使用数组方法取平均值,我得到不同的数字 - 因为所有填充0。这是故意的吗?
In [460]: max_len=6
In [461]: arr=[x+[0]*(max_len-len(x)) for x in list_of_lists]
In [462]: arr
Out[462]:
[[1, 2, 3, 0, 0, 0],
[4, 5, 6, 7, 8, 9],
[0, 0, 0, 0, 0, 0],
[1, 2, 0, 0, 0, 0]]
是否意味着列?
In [463]: np.mean(np.array(arr),axis=0)
Out[463]: array([ 1.5 , 2.25, 2.25, 1.75, 2. , 2.25])
表示行
In [476]: In [463]: np.mean(np.array(arr),axis=1)
Out[476]: array([ 1. , 6.5, 0. , 0.5])
列出最大长度的平均值:
In [477]: [sum(x)/float(max_len) for x in list_of_lists]
Out[477]: [1.0, 6.5, 0.0, 0.5]