2015-01-11 38 views
5

Tôi có một danh sách tùy tiện lồng nhau sâu sắc, với chiều dài khác nhau của các yếu tốChuyển đổi và pad một danh sách để mảng NumPy

my_list = [[[1,2],[4]],[[4,4,3]],[[1,2,1],[4,3,4,5],[4,1]]] 

Tôi muốn chuyển đổi này cho một số hợp lệ (không phản đối) mảng NumPy, bởi đệm ra mỗi trục với NaN. Vì vậy, kết quả sẽ trông giống như

padded_list = np.array([[[ 1, 2, nan, nan], 
         [ 4, nan, nan, nan], 
         [nan, nan, nan, nan]], 
         [[ 4, 4, 3, nan], 
         [nan, nan, nan, nan], 
         [nan, nan, nan, nan]], 
         [[ 1, 2, 1, nan], 
         [ 4, 3, 4, 5], 
         [ 4, 1, nan, nan]]]) 

Làm cách nào để thực hiện việc này?

Trả lời

0

Trước hết, đếm độ dài của một cột và hàng:

len1 = max((len(el) for el in my_list)) 
len2 = max(len(el) for el in list(chain(*my_list))) 

Thứ hai, thêm Nans mất tích:

for el1 in my_list: 
    el1.extend([[]]*(len1-len(el1))) 
    for el2 in el1: 
     el2.extend([numpy.nan] * (len2-len(el2))) 
+1

điều này là tốt, nhưng nên làm việc với các danh sách lồng nhau tùy ý sâu sắc, chẳng hạn như một numpy.array – siamii

5

này hoạt động trên mẫu của bạn, không chắc chắn nó có thể xử lý tất cả các góc đúng cách:

from itertools import izip_longest 

def find_shape(seq): 
    try: 
     len_ = len(seq) 
    except TypeError: 
     return() 
    shapes = [find_shape(subseq) for subseq in seq] 
    return (len_,) + tuple(max(sizes) for sizes in izip_longest(*shapes, 
                   fillvalue=1)) 

def fill_array(arr, seq): 
    if arr.ndim == 1: 
     try: 
      len_ = len(seq) 
     except TypeError: 
      len_ = 0 
     arr[:len_] = seq 
     arr[len_:] = np.nan 
    else: 
     for subarr, subseq in izip_longest(arr, seq, fillvalue=()): 
      fill_array(subarr, subseq) 

Và bây giờ:

>>> arr = np.empty(find_shape(my_list)) 
>>> fill_array(arr, my_list) 
>>> arr 
array([[[ 1., 2., nan, nan], 
     [ 4., nan, nan, nan], 
     [ nan, nan, nan, nan]], 

     [[ 4., 4., 3., nan], 
     [ nan, nan, nan, nan], 
     [ nan, nan, nan, nan]], 

     [[ 1., 2., 1., nan], 
     [ 4., 3., 4., 5.], 
     [ 4., 1., nan, nan]]]) 

Tôi nghĩ rằng điều này là gần như những gì các thói quen khám phá hình dạng của numpy làm. Vì có rất nhiều lời gọi hàm Python có liên quan, nó có thể sẽ không so sánh điều đó với việc thực thi C.

Các vấn đề liên quan