質問: array([[2,2,2,2], [2,2,2,2]]) ``` を縦方向に連結して, ``` array([[[1,1,1,1], [1,1,1,1], [1,1,1,1]], [[2,2,2,2], [2,2,2,2]]]) ``` というような**3次元の**ndarray配列を作りたいです. np.vstackで連結すると,新しい軸が追加されないため連結したものも2次元配列になってしまいます. 具体的には,クラス分類用のデータセットとして画像データをndarray形式で読み込んだとき,256次元(ここはそろっている)*?(ここはクラスごとに異なる)のようになっている各クラスの配列を1つのデータとしてまとめたい(しかしクラスごとにインデックスでアクセスしやすいように3次元配列になっている)というようなことを実現したいです. よろしくお願いします.
回答: 「ジャグ配列」というものになるらしいです。 ジャグ配列 / ジャグ配列 - 配列 - ウィキペディア Pythonだと、listなどに入れてnumpy配列に変換する とかで短く説明されています。 > > listなど(tupleとかでも可)に入れてnumpy配列に変換することができます。普通に想像する通りの動作になります。 > > > たとえば画像のlistをnumpy配列として扱いたい......というときなどはこの方法で構わないと思います。 > > なお、ndimが揃わないとエラーになります。 > > > ndimが同じでshapeが揃わない場合、エラーにこそならないもののobject型の配列という扱いになり、うまく変換できません。 > > > ということで、質問の配列を元に、`c = np.array((a,b))` とか `c = np.array([a,b])` とすると、以下のようなオブジェクトが出来ます。 ``` array([array([[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]), array([[2, 2, 2, 2], [2, 2, 2, 2]])], dtype=object) ``` 両方が同じshapeなら、以下のようになります。 ``` array([[[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]], [[2, 2, 2, 2], [2, 2, 2, 2], [2, 2, 2, 2]]]) ``` 何かしらのモノが出来て、処理は続けられるので、上記のような形になることを前提にしてプログラムを作っていく、というのも一考でしょう。