2016-10-18 18 views
5

W jaki sposób można użyć podprogramów numpy/python?Jak zamienić każdy element tablicy na 4 kopie w Pythonie?

E.g. Jeżeli muszę tablicę [ [1,2,3,4,]], dane wyjściowe powinny być

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

Zatem wyjście jest szereg podwójnych rzędów i kolumn wymiarach. A każdy element z oryginalnej tablicy powtarza się trzy razy.

Co mam tak daleko jest ten

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

To daje mi tablicę

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

dla wejścia

[[98 40] 
[29 54]] 

Tablica zawsze będzie nawet wymiarach.

Odpowiedz

3

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

Objaśnienie:

pierwsze można powtórzyć elementy arrya:

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

następnie wszystkie potrzebne jest przekształcanie wynik (w oparciu na twoim oczekiwanym wyniku może być inaczej):

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

I teraz należy powtórzyć wynik wzdłuż pierwszej osi:

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

można dodać kilka uwag dotyczących samego parametrów? To byłoby pomocne. – CyprUS

+0

@ CyprUS Właśnie zaktualizowany. – Kasramvd

1

Innym rozwiązaniem mogłoby być z np.kron -

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

Zasadniczo możemy przekształcić tablicę wejściowe do 2D tablica zachowująca drugą oś length=2. Następnie np.kron zasadniczo replikuje elementy wzdłuż obu rzędów i kolumn dla długości 2, każdy z tą tablicą: np.ones((2,2),dtype=int).

run Sample -

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

Jeśli chciałbyś mieć 4 wiersze, zamiast używać a.reshape(2,-1).

0

Lepszym rozwiązaniem jest użycie numpy ale można użyć również iteracja:

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]] 
Powiązane problemy