Python 无法在numpy数组中插入三个连续的零
我试图在给定数组中的每个备用位置插入3个连续的零。这可以很好地处理列表,但不能处理数组,因为当我运行for循环时,它不会将其保存在数组中,而只是暂时打印它Python 无法在numpy数组中插入三个连续的零,python,arrays,numpy,Python,Arrays,Numpy,我试图在给定数组中的每个备用位置插入3个连续的零。这可以很好地处理列表,但不能处理数组,因为当我运行for循环时,它不会将其保存在数组中,而只是暂时打印它 var = [1,2,3,4,5] n = 0 for j in range(4): for i in range(3): n = n+1 var.insert(n,0) n=n+1 print(var) zero_3 = np.zeros(3) var2 = np.array([1,2,3,
var = [1,2,3,4,5]
n = 0
for j in range(4):
for i in range(3):
n = n+1
var.insert(n,0)
n=n+1
print(var)
zero_3 = np.zeros(3)
var2 = np.array([1,2,3,4,5])
for n in range(1,5):
print(var2)
print(np.insert(var2,n,zero3))
print(var2)
n=n+3
#Output when I run it shows this:
#var
#[1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 5]
#var2 for all lines below
#[1 2 3 4 5]
#[1 0 0 0 2 3 4 5]
#[1 2 3 4 5]
#[1 2 3 4 5]
#[1 2 0 0 0 3 4 5]
#[1 2 3 4 5]
#[1 2 3 4 5]
#[1 2 3 0 0 0 4 5]
#[1 2 3 4 5]
#[1 2 3 4 5]
#[1 2 3 4 0 0 0 5]
#[1 2 3 4 5]
在封面下插入只是在做:
In [97]: res = np.zeros((var2.shape[0]+3*(var2.shape[0]-1)), dtype=var2.dtype)
In [98]: res[::4]=var2
In [99]: res
Out[99]: array([1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 5])
实际上,您要做的是称为填充,并且有一个现成的函数供您使用,如
np.pad
var = np.arange(5) + 1 # -> array([1, 2, 3, 4, 5])
var = var.reshape(5 ,1) # -> array([[1],[2],[3],[4],[5]])
var = np.pad(var, ((0,0), (0,3)), mode='constant',constant_values=0)
var = var.reshape(-1) # to flattern the tensor, make it a rank-1 array, after executing this line, var should be like array([1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0])
# if you don't want the last 3 zeros, do:
var = var[:-3]
np.pad
的基本用法是
np.pad(var, ((left1, right1), (left2,right2)),mode='constant',constant_values=0)
其中,var
是带有形状的秩2张量[A,B]
,返回的张量带有形状[A+left1+right1,B+left2+right2]
left1,right1,left2,right2,A,B
的含义可以通过以下图片来解释:
把这个公式推广到秩n张量是很容易的。但为了简单起见,我只写秩-2张量作为例子
有关更复杂的用法,请参阅。
np。插入操作不到位。它每次都会生成一个新数组(因此与列表代码相比效率很低)。如果在答案中添加“细节”,这将是一个很好的答案——在我看来,比现有的答案要好。所以答案不应该是“仅链接”,甚至参考文档也不如在答案中包含解释。@alexis谢谢你的建议!我现在已经添加了详细信息^ ^很高兴我能帮上忙。现在,我承认我不是一个numpy
专家,但我仍然不理解这个解释;left1
,right1
等做什么?为什么事后调用var.reformate(-1)
?如果我想在每对值之间加上三个零,我可以复制粘贴你的代码而不理解它,但对于任何其他类似的应用程序,我都会完全不知所措。@alexis我添加了一张图片,以便更直观地解释。
np.pad(var, ((left1, right1), (left2,right2)),mode='constant',constant_values=0)