2017-07-06 112 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])