Python 零填充numpy数组

Python 零填充numpy数组,python,numpy,Python,Numpy,假设有一个列表包含长度不等的列表 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) 但我想知道有什么

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

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的构造函数。可悲的是,据我所知,没有

可能不太理想,但稍微快一点的解决方案是创建带零的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

严格来说,这不是numpy的函数,但您可以这样做

from itertools import izip, izip_longest
import numpy
a=[[1,2,3], [4], [5,6]]
res1 = numpy.array(list(izip(*izip_longest(*a, fillvalue=0))))
或者,或者:

res2=numpy.array(list(izip_longest(*a, fillvalue=0))).transpose()

如果您使用Python3,请使用
zip
itertools.zip\u

您做了什么attempts@megawac我更新我的问题。我正试图找到另一种numpy方法。问题的答案是+1,因为我之前就想要这样的东西,但想不出任何足够干净的东西。(我有时使用
pd.DataFrame(a).fillna(0).values
,但我已经玩了一段时间了。应该有一些
numpy
-native。)numpy 1中有一个函数。7@alko:true,但它做的第一件事是对参数调用
narray=np.array(array)
,如果它是一个长度不同的列表列表,则会给我们一个dtype=object的数组,列表为元素。它很适合填充现有的
ndarray
s,但我看不出如何让它在这里发挥作用。这是一个不错的解决方案,但与我的机器上的手动填充有关(正如预期的那样--主要的缺点是生成新列表)