

異なるshapeのndarrayを，新しい軸を追加した状態で連結するにはどうすればよいでしょうか？

例えば，2つの異なるshape(列数は等しい)の2次元配列

[code]

    a = array([[1,1,1,1],
               [1,1,1,1],
               [1,1,1,1]])
    
    b = array([[2,2,2,2],
               [2,2,2,2]])
    
[/code]

を縦方向に連結して，

[code]

    array([[[1,1,1,1],
            [1,1,1,1],
            [1,1,1,1]],
           [[2,2,2,2],
            [2,2,2,2]]])
    
[/code]

というような **3次元の** ndarray配列を作りたいです．  
np.vstackで連結すると，新しい軸が追加されないため連結したものも2次元配列になってしまいます．

具体的には，クラス分類用のデータセットとして画像データをndarray形式で読み込んだとき，256次元（ここはそろっている）*?(ここはクラスごとに異なる)のようになっている各クラスの配列を1つのデータとしてまとめたい（しかしクラスごとにインデックスでアクセスしやすいように3次元配列になっている）というようなことを実現したいです．

よろしくお願いします．


CC BY-SA 4.0
2019-04-23T05:57:00.667
54413
2022-01-03T06:00:55.080
33036
question
python numpy
異なるshapeのndarrayを，新しい軸を追加した状態で連結したい


「ジャグ配列」というものになるらしいです。  
[ジャグ配列](https://www.atmarkit.co.jp/ait/articles/1701/10/news021.html) / [ジャグ配列
- 配列 -
ウィキペディア](https://ja.wikipedia.org/wiki/%E9%85%8D%E5%88%97#%E3%82%B8%E3%83%A3%E3%82%B0%E9%85%8D%E5%88%97)

Pythonだと、[listなどに入れてnumpy配列に変換する](https://www.haya-
programming.com/entry/2018/11/11/143147#list%E3%81%AA%E3%81%A9%E3%81%AB%E5%85%A5%E3%82%8C%E3%81%A6numpy%E9%85%8D%E5%88%97%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B)
とかで短く説明されています。

> listなど（tupleとかでも可）に入れてnumpy配列に変換することができます。普通に想像する通りの動作になります。
>
> たとえば画像のlistをnumpy配列として扱いたい……というときなどはこの方法で構わないと思います。  
>  なお、ndimが揃わないとエラーになります。
>
> ndimが同じでshapeが揃わない場合、エラーにこそならないもののobject型の配列という扱いになり、うまく変換できません。

ということで、質問の配列を元に、`c = np.array((a,b))` とか `c = np.array([a,b])`
とすると、以下のようなオブジェクトが出来ます。

[code]

    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)
    
[/code]

両方が同じshapeなら、以下のようになります。

[code]

    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]]])
    
[/code]

何かしらのモノが出来て、処理は続けられるので、上記のような形になることを前提にしてプログラムを作っていく、というのも一考でしょう。


CC BY-SA 4.0
2019-04-25T14:48:40.943
54481
2019-04-25T14:48:40.943
26370
54413
answer


<https://stackoverflow.com/questions/3386259/how-to-make-a-multidimension-
numpy-array-with-a-varying-row-size/43463348#answer-3386428>

が似た質問ですけど

> it's optimized for homogeneous arrays of numbers with fixed dimensions. If
> you really need arrays of arrays, better use a nested list

とある通りで、  
NumPyは、固定サイズの同次元の数値配列を前提に最適化することで高速な演算や柔軟な操作を担保しているのであって、端的に言えば
**その前提が崩れるならNumPyを使う意味がない!** と思います。


CC BY-SA 4.0
2019-04-25T15:24:11.317
54482
2019-04-25T15:24:11.317
12274
54413
answer