2017-07-06 113 views
1

我有一个numpy的数组:蟒numpy的:如何重复特定元件在numpy的阵列

arr=np.array([0,1,0,0.5]) 

我需要形成从它一个新的数组如下,使得每个零个元素被重复三次,每一个非-zero元素有2个前面的零,后面是非零数字。总之,每个元素重复三次,原样为零,非零有两个先前的0,然后是数字本身。它如下所示:

([0,1,0,0.5])=0,0,0, [for index 0] 
       0,0,1 [for index 1] 
       0,0,0 [for index 2, which again has a zero] and 
       0,0,0.5 

最终输出应为:

new_arr=[0,0,0,0,0,1,0,0,0,0,0,0.5] 

np.repeat()重复所有的数组元素的n倍数,但我不希望出现这种情况完全相同。这应该怎么做?谢谢您的帮助。

回答

3

快速重塑随后调用np.pad将做到这一点:

np.pad(arr.reshape(-1, 1), ((0, 0), (2, 0)), 'constant') 

输出:

array([[ 0. , 0. , 0. ], 
     [ 0. , 0. , 1. ], 
     [ 0. , 0. , 0. ], 
     [ 0. , 0. , 0.5]]) 

你会想再次将其压平。只需拨打.reshape(-1,)即可完成。

>>> np.pad(arr.reshape(-1, 1), ((0, 0), (2, 0)), 'constant').reshape(-1,) 
array([ 0. , 0. , 0. , 0. , 0. , 1. , 0. , 0. , 0. , 0. , 0. , 
    0.5]) 
+0

大!非常感谢!你能解释一下((0,0),(2,0))吗? – Ishi

+0

@Ishi的确我可以。 '(0,0)'是为上边和下边指定填充,而'(2,0)'是为左边和右边指定填充。由于我们只想填充左边,所以我们必须将其他所有内容都设置为0.''constant''意味着0填充。乐意效劳。 –

+0

明白了!非常好的解释。另外,重塑(-1,)意味着我们没有指定行数和列数,它们将与原始数据相同?谢谢你的帮助! – Ishi

0

pad思想的变体是连接零

In [477]: arr=np.array([0,1,0,0.5]) 
In [478]: np.column_stack([np.zeros((len(arr),2)),arr]) 
Out[478]: 
array([[ 0. , 0. , 0. ], 
     [ 0. , 0. , 1. ], 
     [ 0. , 0. , 0. ], 
     [ 0. , 0. , 0.5]]) 
In [479]: _.ravel() 
Out[479]: 
array([ 0. , 0. , 0. , 0. , 0. , 1. , 0. , 0. , 0. , 0. , 0. , 
     0.5]) 

或填充在另一个方向上的2D阵列:

In [481]: np.vstack([np.zeros((2,len(arr))),arr]) 
Out[481]: 
array([[ 0. , 0. , 0. , 0. ], 
     [ 0. , 0. , 0. , 0. ], 
     [ 0. , 1. , 0. , 0.5]]) 
In [482]: _.T.ravel() 
Out[482]: 
array([ 0. , 0. , 0. , 0. , 0. , 1. , 0. , 0. , 0. , 0. , 0. , 
     0.5])