零填充Python中的多个值

时间:2013-05-04 11:27:25

标签: python numpy

在另一个SO中,这是一个在numpy.array中的值之间添加单个零的解决方案:

import numpy as np

arr = np.arange(1, 7)                 # array([1, 2, 3, 4, 5, 6])
np.insert(arr, slice(1, None, 2), 0)  # array([1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6])

如何在原始数组中的每个值之间添加更多零?例如,5个零:

np.array([1, 0, 0, 0, 0, 0,
          2, 0, 0, 0, 0, 0,
          3, 0, 0, 0, 0, 0,
          4, 0, 0, 0, 0, 0,
          5, 0, 0, 0, 0, 0, 6])

3 个答案:

答案 0 :(得分:3)

您可以创建一个2dim数组,并将其展平:

import numpy as np
a = np.arange(1,7)
num_zeros = 5
z = np.zeros((a.size, num_zeros))

np.append(a[:,np.newaxis], z, axis=1)
array([[ 1.,  0.,  0.,  0.,  0.,  0.],
       [ 2.,  0.,  0.,  0.,  0.,  0.],
       [ 3.,  0.,  0.,  0.,  0.,  0.],
       [ 4.,  0.,  0.,  0.,  0.,  0.],
       [ 5.,  0.,  0.,  0.,  0.,  0.],
       [ 6.,  0.,  0.,  0.,  0.,  0.]])

np.append(a[:,np.newaxis], z, axis=1).flatten()
array([ 1.,  0.,  0.,  0.,  0.,  0.,  2.,  0.,  0.,  0.,  0.,  0.,  3.,
        0.,  0.,  0.,  0.,  0.,  4.,  0.,  0.,  0.,  0.,  0.,  5.,  0.,
        0.,  0.,  0.,  0.,  6.,  0.,  0.,  0.,  0.,  0.])

np.append(a[:,np.newaxis], z, axis=1).flatten()[:-num_zeros]
array([ 1.,  0.,  0.,  0.,  0.,  0.,  2.,  0.,  0.,  0.,  0.,  0.,  3.,
        0.,  0.,  0.,  0.,  0.,  4.,  0.,  0.,  0.,  0.,  0.,  5.,  0.,
        0.,  0.,  0.,  0.,  6.])

答案 1 :(得分:2)

这是一种方法,使用insert:

In [31]: arr
Out[31]: array([1, 2, 3, 4, 5, 6])

In [32]: nz = 5

In [33]: pos = np.repeat(range(1,len(arr)), nz)

In [34]: pos
Out[34]: 
array([1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5,
   5, 5])

In [35]: np.insert(arr, pos, 0)
Out[35]: 
array([1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0,
       0, 5, 0, 0, 0, 0, 0, 6])

这是另一种方式。此方法不需要临时数组,因此它应该更有效。已填充的数组b已使用np.zeros预先分配,然后arr中的值将被复制到b中,并带有切片分配:

In [45]: b = np.zeros(1 + (nz+1)*(arr.size-1), dtype=arr.dtype)

In [46]: b.size
Out[46]: 31

In [47]: b[::nz+1] = arr

In [48]: b
Out[48]: 
array([1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0,
       0, 5, 0, 0, 0, 0, 0, 6])

答案 2 :(得分:0)

如果它不需要是纯粹的NumPy,你可以这样做:

import numpy

def pad(it, zero_count):
    it = iter(it)
    yield next(it)
    while True:
        element = next(it)
        for n in xrange(zero_count):
            yield 0
        yield element

arr = numpy.fromiter(pad(xrange(1, 7), 5), int, -1)

或者如果你想稍微优化分配:

values = xrange(1, 7)
zero_count = 5
total_length = len(values) + max(0, len(values)-1) * zero_count
arr = numpy.fromiter(pad(values, zero_count), int, total_length)