Python 将列表转换并填充为numpy数组

Python 将列表转换并填充为numpy数组,python,arrays,numpy,Python,Arrays,Numpy,我有一个任意深度嵌套的列表,具有不同长度的元素 my_list = [[[1,2],[4]],[[4,4,3]],[[1,2,1],[4,3,4,5],[4,1]]] 我想通过使用NaN填充每个轴,将其转换为有效的数字(而不是对象)numpy数组。所以结果应该是这样的 padded_list = np.array([[[ 1, 2, nan, nan], [ 4, nan, nan, nan],

我有一个任意深度嵌套的列表,具有不同长度的元素

my_list = [[[1,2],[4]],[[4,4,3]],[[1,2,1],[4,3,4,5],[4,1]]]
我想通过使用NaN填充每个轴,将其转换为有效的数字(而不是对象)numpy数组。所以结果应该是这样的

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]]])

如何进行此操作?

首先,计算列和行的长度:

len1 = max((len(el) for el in my_list))
len2 = max(len(el) for el in list(chain(*my_list)))
第二,追加缺少的NAN:

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

这适用于您的样本,但不确定它是否能够正确处理所有拐角情况:

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)
现在:

>>> 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]]])

我想这大概就是numpy的形状发现程序所做的。由于涉及到大量Python函数调用,因此与C实现相比,它可能不会太差。

这很好,但应适用于任意深度嵌套的列表,如numpy.array