2017-12-18 10 views
0

私のデータは3Dですが、第3軸だけが既知のディメンションを持ち、2D配列に変換する必要があります。異種ディメンションから2D numpy配列へのレンダリング

例:

input = 
[[[1, 2, 3]], 

[[4, 5, 6], 
    [7, 8, 9]], 

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

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

だから、第1および第2の寸法は、私のデータセットに沿って可変であり、第三の一方が一定で前knowedである3Dデータを有しています。

入力のすべてのブロックもnumpy配列です。私はnumpy.vstackを使用してこれを実行し、最初の次元を反復することができることを知っています。しかし、私は可能ならば、私のデータを反復することなく、無限の方法でこのような形を作りたいと思っています。

すでに各ブロックの最初の形を取得し、これらの値を合計してreshapeと一緒に使用するためにリストの比較を実行しようとしました。このように:

def myStack(a): 
    lengths = [item.shape[0] for item in a] 
    common_dim = a[0].shape[1] 
    return a.reshape(np.sum(lengths), common_dim) 

しかし、前述の例では、入力と、私は次のエラーを取得する:

ValueError: cannot reshape array of size 3 into shape (6,3) 

入力見Pythonは形状のnumy.array(3)

を持っているので

アイデア

追加:可能であれば、上記の条件で逆変換を行うのは本当に素晴らしいことです!コメントで推奨されているように

+1

'np.concatenate(inp axis = 0)'についてはどうですか? –

+0

**まったく**あなたは一緒に作業していますか?あなたの 'input'配列の例は*配列ではなく、' list'オブジェクトです。あなたの実際の配列の例を与えてください。配列は "3D"ですが、配列のコンストラクタを 'input'データに使用すると、1次元配列が返されることに注意してください。 –

+0

うーん、私はあなたに選択肢があるとは思わないが、 np.vstack'。配列のリストの 'np.concatenate'です。 –

答えて

1

vstackまたはconcatenate

In [320]: alist 
Out[320]: [[[1, 2, 3]], [[4, 5, 6], [7, 8, 9]], [[1, 2, 3], [4, 5, 6], [7, 8, 9]]] 
In [321]: len(alist) 
Out[321]: 3 

は、リストから配列を作成しようとするとは、単にリストの1次元配列を作成します。あまり役に立たない。 reshapeは機能しません。配列のリスト(又はオブジェクトのような配列)と

In [322]: np.array(alist) 
Out[322]: 
array([list([[1, 2, 3]]), list([[4, 5, 6], [7, 8, 9]]), 
     list([[1, 2, 3], [4, 5, 6], [7, 8, 9]])], dtype=object) 

しかしconcatenate作品:それも、それが配列されたリストとして、その入力を処理するため

In [323]: np.concatenate(alist, axis=0) 
Out[323]: 
array([[1, 2, 3], 
     [4, 5, 6], 
     [7, 8, 9], 
     [1, 2, 3], 
     [4, 5, 6], 
     [7, 8, 9]]) 

concatenateOut[322]で動作します。

vstackは、サブアレイがすべて2dであることを除いて同じことです(この場合はすでに存在しています)。

+0

これは私の問題を解決します。ありがとう!しかし、逆のプロセスを行うことは可能でしょうか?私はsklearnの前処理モジュールでデータを「支配している」ため、データを書き戻す必要があります... –

+0

'np.split'(およびバリアント)は、配列を配列のリストに分割できます。または、あなた自身のリスト理解を使用してください。 – hpaulj

関連する問題