web-dev-qa-db-ja.com

ゼロパッドnumpy配列

配列の最後にゼロを埋め込むよりPython的な方法は何ですか?

def pad(A, length):
    ...

A = np.array([1,2,3,4,5])
pad(A, 8)    # expected : [1,2,3,4,5,0,0,0]

私の実際の使用例では、実際には、配列を1024の最も近い倍数にパディングします。例:1342 => 2048、3000 => 3072

28
Basj

numpy.pad with constantモードは必要なことを行います。2番目の引数としてTupleを渡して、各サイズにパディングするゼロの数を伝えます。たとえば、(2, 3)はパディングします2左側のゼロと右側のゼロ:

次のようにAを指定します。

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

np.pad(A, (2, 3), 'constant')
# array([0, 0, 1, 2, 3, 4, 5, 0, 0, 0])

タプルのタプルをパディング幅として渡すことで、2D numpy配列をパディングすることもできます。これは、((top, bottom), (left, right))の形式を取ります。

A = np.array([[1,2],[3,4]])

np.pad(A, ((1,2),(2,1)), 'constant')

#array([[0, 0, 0, 0, 0],           # 1 zero padded to the top
#       [0, 0, 1, 2, 0],           # 2 zeros padded to the bottom
#       [0, 0, 3, 4, 0],           # 2 zeros padded to the left
#       [0, 0, 0, 0, 0],           # 1 zero padded to the right
#       [0, 0, 0, 0, 0]])

あなたの場合、左側をゼロに設定し、右側のパッドをモジュラー分割から計算します:

B = np.pad(A, (0, 1024 - len(A)%1024), 'constant')
B
# array([1, 2, 3, ..., 0, 0, 0])
len(B)
# 1024

より大きなAの場合:

A = np.ones(3000)
B = np.pad(A, (0, 1024 - len(A)%1024), 'constant')
B
# array([ 1.,  1.,  1., ...,  0.,  0.,  0.])

len(B)
# 3072
53
Psidom

これは動作するはずです:

def pad(A, length):
    arr = np.zeros(length)
    arr[:len(A)] = A
    return arr

might空の配列(np.empty(length))を初期化してからAzerosを別々に入力すると、パフォーマンスがわずかに向上しますが、疑わしいほとんどの場合、高速化はコードの複雑さを増すだけの価値があるでしょう。

埋める値を取得するには、おそらくdivmodのようなものを使用すると思います。

n, remainder = divmod(len(A), 1024)
n += bool(remainder)

基本的に、これは1024が配列の長さを何回分割するか(およびその分割の残りの部分)を計算するだけです。残りがない場合は、n * 1024要素だけが必要です。残りがある場合は、(n + 1) * 1024が必要です。

一緒に:

def pad1024(A):
    n, remainder = divmod(len(A), 1024)
    n += bool(remainder)
    arr = np.zeros(n * 1024)
    arr[:len(A)] = A
    return arr        
4
mgilson

将来の参考のために:

def padarray(A, size):
    t = size - len(A)
    return np.pad(A, pad_width=(0, t), mode='constant')

padarray([1,2,3], 8)     # [1 2 3 0 0 0 0 0]
4
Basj

numpy.pad を使用することもできます。

>>> A = np.array([1,2,3,4,5])
>>> npad = 8 - len(A)
>>> np.pad(A, pad_width=npad, mode='constant', constant_values=0)[npad:]
array([1, 2, 3, 4, 5, 0, 0, 0])

そして関数内:

def pad(A, npads):
    _npads = npads - len(A)
    return np.pad(A, pad_width=_npads, mode='constant', constant_values=0)[_npads:]
2
Moses Koledoye

np.padがあります:

A = np.array([1, 2, 3, 4, 5])
A = np.pad(A, (0, length), mode='constant')

ユースケースに関して、パッドに必要なゼロの数はlength = len(A) + 1024 - 1024 % len(A)として計算できます。

2
lballes