3

在另一个 SO 中,这是在 a 中的值之间添加单个零的解决方案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])
4

3 回答 3

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.])
于 2013-05-04T12:18:10.447 回答
2

这是一种方法,使用插入:

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])
于 2013-05-04T11:38:21.857 回答
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)
于 2013-05-04T13:27:15.440 回答