2017-06-05 30 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