在另一个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])
答案 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)