9

長さが等しくないリストを含むリストがあるとします。

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)

しかし、この作業を行うための簡単な方法はあるのでしょうか?

4

2 に答える 2

7

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
于 2013-11-09T17:56:33.793 に答える
2

厳密には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()

Python 3 を使用する場合はzip、 とを使用しitertools.zip_longestます。

于 2013-11-09T18:07:40.207 に答える