2013-10-28 13 views
10

Mam dwie tablice A i B o nieznanych wymiarach, które chcę połączyć wzdłuż wymiaru N. Na przykład:Łączenie niewidocznych tablic o nieznanym wymiarze na osi arbitralnej

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

Powiązane pytanie jest zadawane here. Niestety, proponowane rozwiązania nie działają, gdy wymiary są nieznane i konieczne może być dodanie kilku nowych osi do uzyskania minimalnego wymiaru N.

Co mam zrobić jest rozszerzenie kształt z 1-aż do N tego wymiaru, a następnie złączyć:

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) 

Z tym kodem powinienem móc łączyć a (2,2,1,3) z tablicą (2,2) wzdłuż osi 3, na przykład.

Czy istnieją lepsze sposoby osiągnięcia tego celu?

ps: zaktualizowano jako sugerowaną pierwszą odpowiedź.

Odpowiedz

1

nie sądzę, nie ma nic złego w swoim podejściu, chociaż można uczynić swój kod trochę bardziej zwarty:

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

Dziękujemy! tak jest dużo lepiej. Mimo to szukałem jakiegoś rozwiązania, unikając wyraźnej konstrukcji nowych kształtów. 'vstack' i' dstack' robią to, co chcę, tylko dla macierzy 2d i 3d. – Miguel

1

Alternatywą korzystając 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

Rdzeń 'expand_dims' jest przekształceniem:' a.reshape (shape [: axis] + (1,) + shape [axis:] ' – hpaulj

0

To powinno działać :

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