6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

numpy.ndarrayとlistの違い(次元,サイズ編)

Last updated at Posted at 2020-01-22

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型に変換すれば確認可能


また,当たり前ですが,型と次元によって出力表現は変わりませんでした.
####サイズの表記

次元 ndarray型 組込みlist型
1次元 (3, ) (3, )
2次元 (3, 4) (3, 4) ※

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

numpy.ndarray型

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

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

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]

次にサイズを見てみる. インスタンス変数 ndarray.shape で確認. 1次元のndarray型配列は`(要素数,)`で表される.
# 配列サイズ
A_np.shape : (2,)
B_np.shape : (2,)
C_np.shape : (2,)
D_np.shape : (2,)

組込みlist型

Pythonの組み込み型

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

A = [5, 2]
B = [10, 9]
C = [1, 11]
D = [9, 1]
# 代入の結果
A : [5, 2]
B : [10, 9]
C : [1, 11]
D : [9, 1]

#### 結果 同じく,次にサイズを見てみる. 組込みlistでも,numpy.shape() で配列サイズが返ってくる. 1次元配列で要素が2つあります.
# サイズ np.shape()関数バージョン
np.shape(A) : (2,)
np.shape(B) : (2,)
np.shape(C) : (2,)
np.shape(D) : (2,)

1次元の場合は組込み変数len()でもサイズ(=要素数)の確認ができます. 2次元の場合はサイズは返ってきません.あくまでもlistの要素数です.
# サイズ len()関数バージョン
len(A) : 2
len(B) : 2
len(C) : 2
len(D) : 2

コード 2次元配列

組込みlistの2次元は『リスト内包表記』を利用します.

A = [[12, -8, 4], [0, 6, -10]
# 代入の結果
[[12, -8, 4], [0, 6, -10]

組込み変数len()の出力はlistの要素数2になります.

# サイズ
len(A) : 2

組込みlist型の2次元配列サイズを求めたいときは,2つの方法があります. 1つ目は,np.shape関数を使う方法. 2つ目は,numpy.ndarray型に変換してからndarray.shapeを使う方法.

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

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

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

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

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)

注意

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

A = [[12, -8, 4], [0, 6, -10, 2]]

このとき,組込みlist型の2次元配列で内部にまたlist型要素が2つ入っています.
それらの要素の長さが異なります.


このときの結果が,

len(A) : 2
np.shape(A) : (2,)

numpy.ndarrayに変換しても,

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)はエラーになりました.


つまり,要素数が違うリスト内包表記は,行列としてサイズが測れないのでリストの長さが返ってきているということになります.まあ,当たり前か.

6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?