2017-06-05 28 views
0

我有一个二维形状列表(300,000,X),其中每个子列表具有不同的大小(X)并包含0到25之间的整数。为了将数据转换为Tensor,所有的子列表需要具有相同的长度,但我不想从转换中的子列表中丢失任何数据。如何有效地将大型非矩形2D列表转换为更大的矩形2D数组?

乍一看,我想填充比填充符(-1)最长的子列表小的所有子列表,以便创建一个矩形阵列。对于我的当前数据集,所述子列表最长是长度5037

我的转换代码如下:

for seq in new_format: seq.extend([-1] * (length - len(seq)))

然而,当有300000个序列new_format,和length-len(seq)一般为> 4000,则由于其庞大的规模,过程导致MemoryError。为了平衡子列表,大多数子列表延长到5037时会变得更长。我怎样才能使这个空间更有效率或完全避免这个问题?

+0

是所有元素的数字?如果是的话,他们的范围是什么(典型的最小值和最大值),并且是这些浮点数还是整数? – MSeifert

+0

我更新了这个问题;所有元素都是介于0和25之间的整数。 –

+0

还有'(300,000,X)'形状是什么意思? '300 x 0 x X'?三个零不合理。 – MSeifert

回答

3

我的建议是?不要构建一个Python列表来初始化数组。这会太记忆太重了。由于您的值落在0-25之间,和你想的-1填充剂,可以使用np.int8

首先,初始化一个适当成形的阵列与适当的填充值:

>>> arr = np.full((300000, 5037), -1, dtype=np.int8) 

然后简单循环覆盖您现有的数据并根据需要设置值。

>>> for i, row in enumerate(data): 
...  for j, val in enumerate(row): 
...   arr[i, j] = val 
... 

这会给你的约1.5演出一个不错的紧凑阵列:

>>> arr.nbytes*1e-9 
1.5111