2013-10-28 18 views
10

私はとBの配列を持っており、N番目の次元に沿って連結したいと思います。たとえば、任意の軸に沿った未知の次元のnumpy配列の連結

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

関連する質問があります。here残念ながら、ディメンションが不明な場合に提案されたソリューションが機能しないため、最小寸法がNになるまで、いくつかの新しい軸を追加する必要があります。 (私が連結することができるはずです。このコードで

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) 

2,2,1,3:私が行っている何

N番目の大きさになるまで1のアップと形状を拡張して、連結することです)配列を軸3に沿った(2,2)配列で置き換えます。

これを達成するより良い方法はありますか?

ps:最初の回答が示唆通りに更新されました。私はあなたのアプローチに何か問題がないと思う

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

答えて

1

、あなたはもう少しコンパクトなコードを作ることができますが:

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

ありがとう!それははるかに良いです。それでも、私が探していたのは、新しい形状の明示的な構築を避ける解決策でした。 'vstack'と' dstack'は、2次元配列と3次元配列に対してのみ行います。 – Miguel

1

代替、 :

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) 
+0

「expand_dims」のコアは、reshapeです。a.reshape(shape [:axis] +(1、)+ shape [axis:] ' – hpaulj

関連する問題