2016-10-18 19 views
5

Bunu yapmak için numpy/python dizi rutinlerini nasıl kullanırım?Her dizi öğesi Python'da 4 kopya ile nasıl değiştirilir?

E.g. I dizi [ [1,2,3,4,]] varsa, çıkış Böylece

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

olmalıdır, çıkış çift satır ve sütun boyutlarının dizidir. Ve orijinal diziden her eleman üç kez tekrarlanır.

Ne var bugüne kadar bu giriş dizisi bile her zaman boyutları olacaktır

[[98 40] 
[29 54]] 

bana diziyi

[[ 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]] 

verir bu

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

olduğunu.

cevap

3

Kullanım 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]]) 

Açıklama: Eğer arrya öğeleri tekrarlayabilirsiniz

İlk kapalı: İhtiyacınız olan tüm sonucu yeniden şekillendirilmesi, sonra

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

(tabanlı beklenen sonuç üzerinde bu farklı olabilir):

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

Ve şimdi ilk eksen boyunca sonucu tekrarlamak gerekir:

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

Eğer parametreleri kendisi ile ilgili bazı yorumlar ekleyebilir miyim? Bu yardımcı olur. – CyprUS

+0

@CyprUS Sadece güncellendi. – Kasramvd

1

diğer yaklaşım np.kron ile olabilir - Temelde

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

, bir 2D içine girdi dizisi yeniden şekillendirmek length=2'un ikinci eksenini koruyan dizi. Daha sonra np.kron, öğelerin her birini sırasıyla 2 dizisi boyunca her satır ve sütun boyunca çoğaltır: np.ones((2,2),dtype=int).

Numune koşmak - Eğer 4 satırlarda istiyorsanız

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]]) 

yerine a.reshape(2,-1) kullanın.

0

daha iyi bir çözüm numpy kullanmaktır ama aynı zamanda yineleme kullanabilirsiniz:

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]] 
İlgili konular