others - python - 零填充numpy数组

60 4

在末尾用零填充数组的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

时间: 原作者:

121 1

使用constant模式的numpy.pad可以满足你的需要,可以将元组作为第二个参数传递,以判断每个大小上要填充多少个0,实例将在左侧和右边的处填充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])



也可以通过将元组的元组作为填充宽度来处理一个5位数组,它采用了,((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



原作者:
93 4

这应该可以工作:

 

def pad(A, length):


 arr = np.zeros(length)


 arr[:len(A)] = A


 return arr



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

为了获得所需的值,我想你可能只是使用了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 



原作者:
104 5

供将来参考:

 

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]



原作者:
54 2

你还可以使用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:]



原作者:
93 1

np.pad:

 

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


A = np.pad(A, (0, length), mode='constant')



对于你的用例,可以计算所需的0数目,length = len(A) + 1024 - 1024 % len(A)

原作者:
...