配列の最後にゼロを埋め込むより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
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
これは動作するはずです:
def pad(A, length):
arr = np.zeros(length)
arr[:len(A)] = A
return arr
might空の配列(np.empty(length)
)を初期化してからA
とzeros
を別々に入力すると、パフォーマンスがわずかに向上しますが、疑わしいほとんどの場合、高速化はコードの複雑さを増すだけの価値があるでしょう。
埋める値を取得するには、おそらく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
将来の参考のために:
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]
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:]
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)
として計算できます。