2013-10-28 6 views
10

Ich habe zwei Arrays A und B unbekannter Dimensionen, die ich entlang der N th-Dimension verketten möchte. Zum Beispiel:Verkettung von numpy Arrays unbekannter Dimension entlang beliebiger Achse

>>> A = rand(2,2)  # just for illustration, dimensions should be unknown 
>>> B = rand(2,2)  # idem 
>>> N = 5 

>>> C = concatenate((A, B), axis=N) 
numpy.core._internal.AxisError: axis 5 is out of bounds for array of dimension 2 

>>> C = stack((A, B), axis=N) 
numpy.core._internal.AxisError: axis 5 is out of bounds for array of dimension 3 

Eine verwandte Frage wird here gestellt. Leider funktionieren die vorgeschlagenen Lösungen nicht, wenn die Dimensionen unbekannt sind und wir müssen möglicherweise mehrere neue Achsen hinzufügen, bis eine minimale Dimension von N erreicht wird.

Was ich getan habe, ist die Form mit 1 ist bis zur N ten Dimension zu erweitern und dann verketten:

newshapeA = A.shape + (1,) * (N + 1 - A.ndim) 
newshapeB = B.shape + (1,) * (N + 1 - B.ndim) 
concatenate((A.reshape(newshapeA), B.reshape(newshapeB)), axis=N) 

Mit diesem Code soll ich in der Lage sein, ein verketten (2,2,1,3) Array mit einem (2,2) Array entlang der Achse 3, zum Beispiel.

Gibt es bessere Möglichkeiten, dies zu erreichen?

ps: aktualisiert wie vorgeschlagen die erste Antwort.

Antwort

1

Ich glaube nicht, dass es etwas falsch mit Ihrem Ansatz ist, obwohl Sie Ihren Code ein wenig kompakter machen:

newshapeA = A.shape + (1,) * (N + 1 - A.ndim) 
+0

Danke! das ist viel besser. Was ich suchte, war eine Lösung, die die explizite Konstruktion neuer Formen vermeidet. 'vstack' und' dstack' machen was ich will nur für 2D und 3D Arrays. – Miguel

1

Eine Alternative, mit numpy.expand_dims:

>>> import numpy as np 
>>> A = np.random.rand(2,2) 
>>> B = np.random.rand(2,2) 
>>> N=5 


>>> while A.ndim < N: 
     A= np.expand_dims(A,x) 
>>> while B.ndim < N: 
     B= np.expand_dims(B,x) 
>>> np.concatenate((A,B),axis=N-1) 
+0

der Kern 'expand_dims' ist ein reshape:' a.reshape (shape [: axis] + (1) + Form [Achse:] ' – hpaulj

0

Diese Arbeit sollte :

def atleast_nd(x, n): 
    return np.array(x, ndmin=n, subok=True, copy=False) 

np.concatenate((atleast_nd(a, N+1), atleast_nd(b, N+1)), axis=N) 
Verwandte Themen