假设我有一个包含不等长列表的列表。

a = [ [ 1, 2, 3], [2], [2, 4] ]

获得具有标准形状的零填充numpy数组的最佳方法是什么?
zero_a = [ [1, 2, 3], [2, 0, 0], [2, 4, 0] ]

我知道我可以像这样使用列表操作
n = max( map( len, a ) )
map( lambda x : x.extend( [0] * (n-len(x)) ), a )
zero_a = np.array(zero_a)

但我想知道是否有任何简单的方法来完成这项工作?

最佳答案

由于numpy必须在初始化数组之前就知道数组的大小,因此最好的解决方案是针对这种情况的基于numpy的构造函数。可悲的是,据我所知,没有任何东西。

可能不太理想,但是稍微快一点的解决方案是使用零创建numpy数组并填充列表值。

import numpy as np
def pad_list(lst):
    inner_max_len = max(map(len, lst))
    map(lambda x: x.extend([0]*(inner_max_len-len(x))), lst)
    return np.array(lst)

def apply_to_zeros(lst, dtype=np.int64):
    inner_max_len = max(map(len, lst))
    result = np.zeros([len(lst), inner_max_len], dtype)
    for i, row in enumerate(lst):
        for j, val in enumerate(row):
            result[i][j] = val
    return result

测试用例:
>>> pad_list([[ 1, 2, 3], [2], [2, 4]])
array([[1, 2, 3],
       [2, 0, 0],
       [2, 4, 0]])

>>> apply_to_zeros([[ 1, 2, 3], [2], [2, 4]])
array([[1, 2, 3],
       [2, 0, 0],
       [2, 4, 0]])

表现:
>>> timeit.timeit('from __main__ import pad_list as f; f([[ 1, 2, 3], [2], [2, 4]])', number = 10000)
0.3937079906463623
>>> timeit.timeit('from __main__ import apply_to_zeros as f; f([[ 1, 2, 3], [2], [2, 4]])', number = 10000)
0.1344289779663086

关于python - 零填充numpy数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19878250/

10-16 13:11