如何将numpy数组列表转换为内存更友好的格式



我的问题与将numpy数组列表转换为更友好的内存格式有关,因为我面临内存错误。

这是我用于创建output变量(numpy数组列表)的代码:

#import of the libraries
import pandas as pd
import numpy as np    
#definition of the variables       
numStations = 4
numLinesUnique = np.array([[0, 1, 1, 2],
[1, 0, 1, 1],
[1, 1, 0, 1],
[1, 1, 1, 0]])
traversals = [[[], [[]], [[1]], [[1, 2], [434, 435, 436, 437]]],
[[[]], [], [[]], [[2]]],
[[[1]], [[]], [], [[]]],
[[[2, 1]], [[2]], [[]], []]]
#definition of the outpt variable
output = [[[] for x in range(numStations)] for x in range(numStations)]
#main code
for i in range(numStations):
for j in range(numStations):
if i!=j:
t_numpyTraversals = np.zeros((numLinesUnique[i,j],5500)).astype(bool)            
for k in range(numLinesUnique[i,j]):
t_numpyTraversals[k,traversals[i][j][k]] = True
output[i][j] = t_numpyTraversals

因此,output变量存储长度为5500的booleannumpy数组的列表注意5500是我代码中的原始numStations,这就是为什么我在尝试创建output变量时会出现内存错误。

我将numStations = 4用于for循环作为可再现的示例。

正如您在存储在output变量中的numpy数组中看到的,很少有值是True

到目前为止,我已经尝试使用以下代码在dict中只存储True值:

#redefine the output variable
output = [[[] for x in range(4)] for x in range(4)]
for i in range(numStations):
for j in range(numStations):
if i!=j:
list_of_traversals_stops = []
for k in range(numLinesUnique[i,j]):
tempd = {} #create the dict to store the True values
for kk in range(len(traversals[i][j][k])):
tempd[traversals[i][j][k][kk]] = True
list_of_traversals_stops.append(tempd)
output[i][j].append(list_of_traversals_stops) 

由于output变量不包含许多False值,因此此方法的内存效率更高。然而,output的格式并不能帮助我将其用作另一个函数的输入。

我正在搜索一个替代数据结构(类似于原始输出-numpy数组列表),它对内存友好,也可以存储False值。

有什么建议吗?

列表列表可以工作,但为了提高内存效率,您应该存储索引而不是True/False值,因为您必须存储5500个布尔变量,而不是只跟踪True

的索引如果您需要一个显式的索引到布尔值映射,字典可以工作(类似于您的第二个代码output),但它不如只存储没有布尔值的索引那么友好。

话虽如此,我认为最有效的格式实际上是您定义的traversals变量。您可以使用检索numLinesUnique

numLinesUnique = [[len(col) for col in row] for row in traversals]

我不确定您的output将用于什么用途,但它肯定可以从更节省空间的traversals派生而来。

此外,在您的第二个代码片段中,我认为output是错误的,因为对于output[0][3],我只看到一个列表,我认为它应该有2个。

最新更新