如何有效地将大的非矩形2D列表转换为更大的矩形2D阵列?

时间:2017-06-05 22:54:25

标签: python arrays python-3.x tensorflow

我有一个2-D形状列表(300,000,X),其中每个子列表具有不同的大小(X)并包含0到25之间的整数。为了将数据转换为{{1} },所有子列表都需要具有相同的长度,但我不想丢失转换中的子列表中的任何数据。

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

我的转换代码如下:

Tensor

但是,如果for seq in new_format: seq.extend([-1] * (length - len(seq)))中有300,000个序列,且new_format通常> 4000,则由于其巨大的尺寸,该过程会导致length-len(seq)。大多数子列表在扩展到5037时变得更长,以便均衡子列表。我怎样才能使这更节省空间或完全避免这个问题呢?

1 个答案:

答案 0 :(得分: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