numpy.ndarrayとlistの違い（次元，サイズ編）

numpyのndarrayとPython組込みのlistがゴッチャになっていたため，それぞれの次元やサイズについて自分なりにまとめてみた．
初心者のまとめです．

# まとめ

ググってみた結果，メジャーなサイズの取得方法はlen()関数，np.shape()関数，インスタンス変数ndarray.shapeを使うものでした．

結論としては，**np.shape()を使っておけば安パイ**かと思います．
また，**組込みlist型はリスト内包表記を利用**することで2次元配列表現を実現していることを覚えておくと良いと思いました．

#### サイズ取得関数
|サイズ取得方法|ndarray型|組込みlist型|
|:----------|--------------:|:---------------:|
|      len()        |              1次元のみ |        1次元のみ        |
| np.shape()           |            n次元 |       n次元   |
| ndarray.shape             |              n次元 |        - ※      |

※ np.array()関数の引数に組込みリストを与えてnumpy.ndarray型に変換すれば確認可能

<br>

また，当たり前ですが，型と次元によって出力表現は変わりませんでした．
####サイズの表記
|次元|ndarray型|組込みlist型|
|:----------|--------------:|:---------------:|
|      1次元        |              (3, ) |        (3, )        |
| 2次元           |            (3, 4) |       (3, 4)  ※ |

※ 組込みlist型の2次元配列表現はあくまでリスト内包表記．各要素で要素数が違う内包リストを定義できてしまう．このときの関数の応答がめんどくさい．→ 項目：**注意**へ

# numpy.ndarray型
numpy.array()関数はndarrayを簡単につくれる便利ツールのようです．

####コード
numpy.ndarray型のため，**数値と数値の間に`,`はありません**．

```python
import numpy as np 
A_np = np.array([5, 2], dtype=int)
B_np = np.array([10, 9], dtype=int)
C_np = np.array([1, 11], dtype=int)
D_np = np.array([9, 1], dtype=int)
```
```
# 代入の結果
A_np : [5 2]
B_np : [10  9]
C_np : [ 1 11]
D_np : [9 1]
```
<br>
次にサイズを見てみる．
インスタンス変数　ndarray.shape で確認．
1次元のndarray型配列は`(要素数,)`で表される．

```
# 配列サイズ
A_np.shape : (2,)
B_np.shape : (2,)
C_np.shape : (2,)
D_np.shape : (2,)
```


# 組込みlist型
Pythonの組み込み型

####コード　1次元配列
組込みlist形式のため，**数値の間に`,`が入ります**.

```python
A = [5, 2]
B = [10, 9]
C = [1, 11]
D = [9, 1]
```
```
# 代入の結果
A : [5, 2]
B : [10, 9]
C : [1, 11]
D : [9, 1]
```
<br>
#### 結果
同じく，次にサイズを見てみる．
組込みlistでも，numpy.shape() で配列サイズが返ってくる．
1次元配列で要素が2つあります．

```
# サイズ　np.shape()関数バージョン
np.shape(A) : (2,)
np.shape(B) : (2,)
np.shape(C) : (2,)
np.shape(D) : (2,)
```

<br>
1次元の場合は組込み変数len()でもサイズ（＝要素数）の確認ができます．
2次元の場合はサイズは返ってきません．あくまでもlistの要素数です．

```
# サイズ　len()関数バージョン
len(A) : 2
len(B) : 2
len(C) : 2
len(D) : 2
```

#### コード　2次元配列
組込みlistの2次元は『リスト内包表記』を利用します．

```python
A = [[12, -8, 4], [0, 6, -10]
```
```
# 代入の結果
[[12, -8, 4], [0, 6, -10]
```
組込み変数len()の出力はlistの要素数2になります．

```
# サイズ
len(A) : 2
```
<br>
組込みlist型の2次元配列サイズを求めたいときは，2つの方法があります．
1つ目は，np.shape関数を使う方法．
2つ目は，numpy.ndarray型に変換してからndarray.shapeを使う方法．

1つ目，組込みlist型のまま

```python
A = [[12, -8, 4], [0, 6, -10]]
```
```
A : 
[[12, -8, 4], [0, 6, -10]]

np.shape(A) : (2, 3)
```

2つ目，ndarray型に変換
組込みlist型からdumpy.ndarray型になるので，数値間の`,`が消えます．

```python
A = [[12, -8, 4], [0, 6, -10]
A_np = np.array(A)
```
```
A_np : 
[[ 12  -8   4]
 [  0   6 -10]]

A_np.shape : (2, 3)
```
<br>


# 注意
組込みlist型で2次元配列を使いたいとき，各要素の要素数が違う時めんどくさそうです．
具体的に，

```python
A = [[12, -8, 4], [0, 6, -10, 2]]
```
このとき，組込みlist型の2次元配列で内部にまたlist型要素が2つ入っています．
それらの要素の長さが異なります．
<br>
このときの結果が，

```
len(A) : 2
np.shape(A) : (2,)
```
numpy.ndarrayに変換しても，

```python
A_np = np.array(A)
```

```
A_np : 
[[12, -8, 4] [0, 6, -10, 2]]

np.shape(A_np) : (2,)
```

数値間の`,`がなくなっておらず，要素がlist型のndarray型配列になっている（？）．
おかしなこと言ってたらすみません．自信ないです．
ちなみに，`np.array([[12, -8, 4] [0, 6, -10, 2]], dtype=int)`はエラーになりました．
<br>
つまり，要素数が違うリスト内包表記は，行列としてサイズが測れないのでリストの長さが返ってきているということになります．まあ，当たり前か．