零填充 numpy 数组
Zero pad numpy array
在末尾用零填充数组的更 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]
在我的实际用例中,实际上我想将数组填充到最接近 1024 的倍数。例如:1342 => 2048、3000 => 3072
这应该有效:
def pad(A, length):
arr = np.zeros(length)
arr[:len(A)] = A
return arr
如果您初始化一个空数组 (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
您也可以使用 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)
。
numpy.pad
with 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])
也可以通过传递元组的元组作为填充宽度来填充 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 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]
对于您的用例,您可以使用 resize() 方法:
A = np.array([1,2,3,4,5])
A.resize(8)
这将 A
原位 调整大小。如果有 A
的引用,numpy 会抛出一个值错误,因为引用的值也会被更新。要允许此添加 refcheck=False
选项。
文档指出缺失值将是 0
:
Enlarging an array: as above, but missing entries are filled with zeros
在末尾用零填充数组的更 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]
在我的实际用例中,实际上我想将数组填充到最接近 1024 的倍数。例如:1342 => 2048、3000 => 3072
这应该有效:
def pad(A, length):
arr = np.zeros(length)
arr[:len(A)] = A
return arr
如果您初始化一个空数组 (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
您也可以使用 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)
。
numpy.pad
with 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])
也可以通过传递元组的元组作为填充宽度来填充 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 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]
对于您的用例,您可以使用 resize() 方法:
A = np.array([1,2,3,4,5])
A.resize(8)
这将 A
原位 调整大小。如果有 A
的引用,numpy 会抛出一个值错误,因为引用的值也会被更新。要允许此添加 refcheck=False
选项。
文档指出缺失值将是 0
:
Enlarging an array: as above, but missing entries are filled with zeros