2010-11-19 6 views
19

ich in Python arbeite und ich habe ein NumPy Array wie folgt:Ändern der Größe und Strecken einer NumPy Array

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

Wie dehnen ich es so etwas wie die folgenden?

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

Dies sind nur einige Beispiel-Arrays, ich werde tatsächlich mehrere Größen von Arrays skalieren, nicht nur diese.

Ich bin neu hier, und ich kann einfach nicht meinen Kopf darum drehen, was ich tun muss.

Antwort

21

@, sehr glatt Antwort KennyTM ist und wirklich für Ihren Fall funktioniert, aber als Alternative, die ein bisschen mehr Flexibilität für den Ausbau Arrays versuchen np.repeat könnte bieten:

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

So Wiederholung erreicht dies entlang eine Achse, entlang mehrerer Achsen zu erhalten (wie Sie vielleicht wollen), einfach nisten die np.repeat Anrufe:

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

Sie können auch variieren die Anzahl der Wiederholungen fo r jede erste Zeile oder Spalte. Zum Beispiel wollten, wenn Sie zwei Wiederholungen von jeder Zeile abgesehen von der letzten Reihe:

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

Hier, wenn das zweite Argument ein list ist es eine zeilenweise spezifiziert (Zeilen in diesem Fall, weil axis=0) für jede Zeile wiederholt .

+0

https: //docs.scipy. org/doc/numpy/reference/generiert/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

Falls jemand fragt sich, es ist das Kronecker-Produkt: http: //docs.scipy. org/doc/numpy/referenz/generierte/numpy.kron.html – krawyoti

+0

So cool wie diese Antwort ist, dauert es doppelt so lang wie die Wiederholungsmethode in dtlussier's Antwort auf meinem Rechner für große Arrays –

1

Leider erlaubt numpy keine Teilschritte (soweit mir bekannt ist). Hier ist ein Workaround. Es ist nicht so klug wie Kennys Lösung, aber es macht Verwendung von traditionellen Indizierung:

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

(dtlussier-Lösung ist besser)

Verwandte Themen