2010-11-19 23 views
19

pracuję w Pythonie i mam NumPy tablicę takiego:Zmiana rozmiaru i rozciąganie tablicę NumPy

[1,5,9] 
[2,7,3] 
[8,4,6] 

Jak mogę naciągnąć go na coś jak poniżej?

[1,1,5,5,9,9] 
[1,1,5,5,9,9] 
[2,2,7,7,3,3] 
[2,2,7,7,3,3] 
[8,8,4,4,6,6] 
[8,8,4,4,6,6] 

To tylko niektóre przykładowe tablice, w rzeczywistości zmieniam rozmiar kilku tablic, nie tylko te.

Jestem w tym nowy i nie mogę po prostu objąć głowy tym, co muszę zrobić.

Odpowiedz

21

@ odpowiedź KennyTM jest bardzo śliski, i naprawdę działa w Twoim przypadku, ale jako alternatywa, która może zaoferować nieco większą elastyczność rozbudowy tablice spróbować np.repeat:

>>> a = np.array([[1, 5, 9], 
       [2, 7, 3], 
       [8, 4, 6]]) 

>>> np.repeat(a,2, axis=1) 
array([[1, 1, 5, 5, 9, 9], 
     [2, 2, 7, 7, 3, 3], 
     [8, 8, 4, 4, 6, 6]]) 

Tak, ten realizuje powtarzania wzdłuż jedna oś, aby ją wzdłuż wielu osi (jak możesz), po prostu zagnieździć np.repeat rozmowy:

>>> np.repeat(np.repeat(a,2, axis=0), 2, axis=1) 
array([[1, 1, 5, 5, 9, 9], 
     [1, 1, 5, 5, 9, 9], 
     [2, 2, 7, 7, 3, 3], 
     [2, 2, 7, 7, 3, 3], 
     [8, 8, 4, 4, 6, 6], 
     [8, 8, 4, 4, 6, 6]]) 

można także zmienić liczbę powtórzeń fo r dowolny początkowy wiersz lub kolumnę. Na przykład, jeśli chcesz dwa powtórzenia każdego rzędu oprócz ostatniego wiersza:

>>> np.repeat(a, [2,2,1], axis=0) 
array([[1, 5, 9], 
     [1, 5, 9], 
     [2, 7, 3], 
     [2, 7, 3], 
     [8, 4, 6]]) 

Oto gdy drugi argument jest list określa rzędu mądry (wiersze, w tym przypadku, ponieważ axis=0) powtarza się dla każdego wiersza .

+0

https: //docs.scipy. org/doc/numpy/reference/generated/numpy.repeat.html –

12
>>> a = numpy.array([[1,5,9],[2,7,3],[8,4,6]]) 
>>> numpy.kron(a, [[1,1],[1,1]]) 
array([[1, 1, 5, 5, 9, 9], 
     [1, 1, 5, 5, 9, 9], 
     [2, 2, 7, 7, 3, 3], 
     [2, 2, 7, 7, 3, 3], 
     [8, 8, 4, 4, 6, 6], 
     [8, 8, 4, 4, 6, 6]]) 
+2

W przypadku gdy ktoś zastanawia się, że jest to produkt Kronecker: http: //docs.scipy. org/doc/numpy/reference/generated/numpy.kron.html – krawyoti

+0

tak fajna jak ta odpowiedź, wymaga dwa razy więcej czasu niż metoda repeat w odpowiedzi dtlussiera na moim komputerze dla dużych tablic –

1

Niestety numpy nie zezwala na ułamkowe kroki (o ile mi wiadomo). Oto sposób obejścia tego problemu. To nie jest tak mądry jak roztwór Kenny'ego, ale to sprawia, że ​​korzystanie z tradycyjnej indeksowania:

>>> a = numpy.array([[1,5,9],[2,7,3],[8,4,6]]) 
>>> step = .5 
>>> xstop, ystop = a.shape 
>>> x = numpy.arange(0,xstop,step).astype(int) 
>>> y = numpy.arange(0,ystop,step).astype(int) 
>>> mg = numpy.meshgrid(x,y) 
>>> b = a[mg].T 
>>> b 
array([[1, 1, 5, 5, 9, 9], 
     [1, 1, 5, 5, 9, 9], 
     [2, 2, 7, 7, 3, 3], 
     [2, 2, 7, 7, 3, 3], 
     [8, 8, 4, 4, 6, 6], 
     [8, 8, 4, 4, 6, 6]]) 

(rozwiązanie dtlussier jest lepiej)