零垫numpy数组

Bas*_*asj 28 python numpy zero-pad zero-padding numpy-ndarray

在最后用零填充数组的pythonic方法是什么?

def pad(A, length):
    ...

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

在我的实际用例中,实际上我想将数组填充到1024的最接近倍数.例如:1342 => 2048,3000 => 3072

Psi*_*dom 53

numpy.pad使用constant模式做你需要的,我们可以传递一个元组作为第二个参数来告诉每个大小填充多少个零(2, 3),例如,在左侧填充2个零,在右侧填充3个零:

鉴于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])
Run Code Online (Sandbox Code Playgroud)

也可以通过传递元组元组作为填充宽度来填充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]])
Run Code Online (Sandbox Code Playgroud)

对于您的情况,您指定左侧是零和右侧垫从模块化部门计算:

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

更大的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
Run Code Online (Sandbox Code Playgroud)

  • 如果我有一个 3d 体积要填充怎么办? (2认同)

Bas*_*asj 8

备查:

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]
Run Code Online (Sandbox Code Playgroud)


mgi*_*son 5

这应该有效:

def pad(A, length):
    arr = np.zeros(length)
    arr[:len(A)] = A
    return arr
Run Code Online (Sandbox Code Playgroud)

如果您初始化一个空数组 ( ) 然后分别填充和填充,您可能会获得稍微更好的性能,但我怀疑在大多数情况下加速是否值得额外的代码复杂性。np.empty(length)Azeros

为了获得要填充的价值,我认为您可能只使用以下内容divmod

n, remainder = divmod(len(A), 1024)
n += bool(remainder)
Run Code Online (Sandbox Code Playgroud)

基本上,这只是计算 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        
Run Code Online (Sandbox Code Playgroud)


Mos*_*oye 5

您还可以使用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])
Run Code Online (Sandbox Code Playgroud)

在一个函数中:

def pad(A, npads):
    _npads = npads - len(A)
    return np.pad(A, pad_width=_npads, mode='constant', constant_values=0)[_npads:]
Run Code Online (Sandbox Code Playgroud)


lba*_*les 5

np.pad

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

关于您的用例,需要填充的零数量可以计算为length = len(A) + 1024 - 1024 % len(A)


spi*_*kus 5

对于您的用例,您可以使用resize()方法:

A = np.array([1,2,3,4,5])
A.resize(8)
Run Code Online (Sandbox Code Playgroud)

这将调整A 到位。如果有Anumpy 的refs 会抛出一个 vale 错误,因为引用的值也会被更新。允许此添加refcheck=False选项。

文档指出,缺失值将是0

扩大数组:同上,但缺少的条目用零填充