2016-10-18 34 views
5

如何使用numpy/python數組例程來做到這一點?如何在Python中用4個副本替換每個數組元素?

E.g.如果我有數組[ [1,2,3,4,]],則輸出應該是

[[1,1,2,2,], 
[1,1,2,2,], 
[3,3,4,4,], 
[3,3,4,4]] 

因此,輸出是行和列維度的兩倍數組。並且來自原始數組的每個元素重複三次。

我有什麼到目前爲止,這是

def operation(mat,step=2): 
    result = np.array(mat,copy=True) 
    result[::2,::2] = mat 
    return result 

這給我數組

[[ 98.+0.j 0.+0.j 40.+0.j 0.+0.j] 
[ 0.+0.j 0.+0.j 0.+0.j 0.+0.j] 
[ 29.+0.j 0.+0.j 54.+0.j 0.+0.j] 
[ 0.+0.j 0.+0.j 0.+0.j 0.+0.j]] 

爲輸入

[[98 40] 
[29 54]] 

的陣列將永遠甚至尺寸。

回答

3

使用np.repeat()

In [9]: A = np.array([[1, 2, 3, 4]]) 
In [10]: np.repeat(np.repeat(A, 2).reshape(2, 4), 2, 0) 
Out[10]: 
array([[1, 1, 2, 2], 
     [1, 1, 2, 2], 
     [3, 3, 4, 4], 
     [3, 3, 4, 4]]) 

說明:

首先,你可以重複arrya項目:

In [30]: np.repeat(A, 3) 
    Out[30]: array([1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]) 

那麼所有你需要的是重新塑造的結果(基於在你的預期結果這可以是不同的):

In [32]: np.repeat(A, 3).reshape(2, 3*2) 
    array([[1, 1, 1, 2, 2, 2], 
     [3, 3, 3, 4, 4, 4]]) 

而且現在你應該重複的結果沿着第一軸:

In [34]: np.repeat(np.repeat(A, 3).reshape(2, 3*2), 3, 0) 
    Out[34]: 
    array([[1, 1, 1, 2, 2, 2], 
     [1, 1, 1, 2, 2, 2], 
     [1, 1, 1, 2, 2, 2], 
     [3, 3, 3, 4, 4, 4], 
     [3, 3, 3, 4, 4, 4], 
     [3, 3, 3, 4, 4, 4]]) 
+0

你能添加關於參數本身的一些意見?這將有所幫助。 – CyprUS

+0

@CyprUS剛剛更新。 – Kasramvd

1

另一種方法可能是用np.kron -

np.kron(a.reshape(-1,2),np.ones((2,2),dtype=int)) 

基本上,我們重塑輸入數組爲2D保持第二軸的陣列爲length=2。然後np.kron實質上覆制沿着行和列的元素,長度爲2,每個元素都與該數組相關:np.ones((2,2),dtype=int)

採樣運行 -

In [45]: a 
Out[45]: array([7, 5, 4, 2, 8, 6]) 

In [46]: np.kron(a.reshape(-1,2),np.ones((2,2),dtype=int)) 
Out[46]: 
array([[7, 7, 5, 5], 
     [7, 7, 5, 5], 
     [4, 4, 2, 2], 
     [4, 4, 2, 2], 
     [8, 8, 6, 6], 
     [8, 8, 6, 6]]) 

如果你想有4行,請使用a.reshape(2,-1)代替。

0

更好的解決方案是使用numpy的,但你也可以使用迭代:

a = [[1, 2, 3, 4]] 

v = iter(a[0]) 

b = [] 
for i in v: 
    n = next(v) 
    [b.append([i for k in range(2)] + [n for k in range(2)]) for j in range(2)] 

print b 

>>> [[1, 1, 2, 2], [1, 1, 2, 2], [3, 3, 4, 4], [3, 3, 4, 4]] 
相關問題