2017-03-31 322 views
2

我有不同長度的列表列表(例如[[1, 2, 3], [4, 5], [6, 7, 8, 9]]),並且想要將它轉換爲整數數組numpy。我明白numpy多維數組中的'sub'數組必須具有相同的長度。那麼,如何將上述例子中的列表轉換成numpy這樣的[[1, 2, 3, 0], [4, 5, 0, 0], [6, 7, 8, 9]]這種最有效的方式,即用零填充?將不同長度的列表轉換爲一個numpy數組

回答

4

你可以用np.zeros製作一個numpy數組,並用你的列表元素填充它們,如下所示。

a = [[1, 2, 3], [4, 5], [6, 7, 8, 9]] 
import numpy as np 
b = np.zeros([len(a),len(max(a,key = lambda x: len(x)))]) 
for i,j in enumerate(a): 
    b[i][0:len(j)] = j 

結果

[[ 1. 2. 3. 0.] 
[ 4. 5. 0. 0.] 
[ 6. 7. 8. 9.]] 
2

請名單上的一些預處理,通過填充較短的子列表,轉換爲numpy的陣列之前:

>>> lst = [[1, 2, 3], [4, 5], [1, 7, 8, 9]] 
>>> pad = len(max(lst, key=len)) 
>>> np.array([i + [0]*(pad-len(i)) for i in lst]) 
array([[1, 2, 3, 0], 
     [4, 5, 0, 0], 
     [1, 7, 8, 9]]) 
2

這裏有一個@Divakar類型的答案:

In [945]: ll = [[1, 2, 3], [4, 5], [6, 7, 8, 9]] 
In [946]: lens = [len(l) for l in ll]  # only iteration 
In [947]: lens 
Out[947]: [3, 2, 4] 
In [948]: maxlen=max(lens) 
In [949]: arr = np.zeros((len(ll),maxlen),int) 
In [950]: mask = np.arange(maxlen) < np.array(lens)[:,None] # key line 
In [951]: mask 
Out[951]: 
array([[ True, True, True, False], 
     [ True, True, False, False], 
     [ True, True, True, True]], dtype=bool) 
In [952]: arr[mask] = np.concatenate(ll) # fast 1d assignment 
In [953]: arr 
Out[953]: 
array([[1, 2, 3, 0], 
     [4, 5, 0, 0], 
     [6, 7, 8, 9]]) 

對於大型列表,它有可能更快。但是很難理解和/或重新創建。

Convert Python sequence to NumPy array, filling missing values - Divakar有一篇很好的文章。 itertools.zip_longest也被提及。這可以被引用爲重複。

相關問題