gijyutsu-keisan.com

2.2.Numpy配列の属性

ndim 配列の次元を取得します。
shape 配列の(行列)型を取得します。
size 配列要素の数を取得します。
dtype 配列のデータ型を取得します。
>>> x = np.random.normal(0,10,(3,5))

#配列の次元取得
>>> x.ndim
2

#配列の型を取得
>>> x.shape
(3, 5)

#配列の要素数を取得
>>> x.size
15

#配列のデータ型を取得
>>> x.dtype
dtype('float64')

節はじめに戻る

2.3.Numpy配列の要素抽出

  1. 指定行の抽出
  2. 指定列の抽出
  3. 指定要素の抽出
  4. 抽出要素の変数への代入

次の配列をサンプルとして、Numpy配列内の要素を抽出していきます。
#5×5行列を作成
>>> A=np.array([[0,1,2,3,4],[5,6,7,8,9],[10,11,12,13,14],[15,16,17,18,18],[20,21,22,23,24]])
>>> A
array([[ 0,  1,  2,  3,  4],
[ 5,  6,  7,  8,  9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 18],
[20, 21, 22, 23, 24]])

(1)指定行の抽出

  • A[行番号] (Aは配列変数)
指定した1行を抽出できます。行番号は“0”から始めます。 例として、Aの2行目を抽出します。
\[ \begin{array}{ccccc} 0 & 1 & 2 & 3 & 4 \\ \hline \color{blue} 5 & \color{blue} 6 & \color{blue} 7 & \color{blue} 8 & \color{blue} 9 \\ \hline 10 & 11 & 12 & 13 & 14 \\ 15 & 16 & 17 & 18 & 19 \\ 20 & 21 & 22 & 23 & 24 \end{array} \]
#Aの2行目を取得
>>> A[1]
array([5, 6, 7, 8, 9])
  • A[[行番号, 行番号, 行番号, ...]]
複数行を個別に指定して抽出できます。 行番号の個別指定はリスト[*,*,*]で行います。 ここではAの2行目と4行目を抽出します。
\[ \begin{array}{ccccc} 0 & 1 & 2 & 3 & 4 \\ \hline \color{blue}5 & \color{blue}6 & \color{blue}7 & \color{blue}8 & \color{blue}9 \\ \hline 10 & 11 & 12 & 13 & 14 \\ \hline \color{blue}{15} & \color{blue}{16} & \color{blue}{17} & \color{blue}{18} & \color{blue}{19} \\ \hline 20 & 21 & 22 & 23 & 24 \end{array} \]
#Aの2、4行目を取得
>>> A[[1,3]]
array([[ 5,  6,  7,  8,  9],
[15, 16, 17, 18, 19]])
  • A[開始行番号:終了行番号]
連続する複数行を抽出できます (“:”指定時の完了番号は含まれません)。 ここではAの2~4行目を抽出します。
\[ \begin{array}{ccccc} 0 & 1 & 2 & 3 & 4 \\ \hline \color{blue} 5 & \color{blue} 6 & \color{blue} 7 & \color{blue} 8 & \color{blue} 9 \\ \color{blue}{10} & \color{blue}{11} & \color{blue}{12} & \color{blue}{13} & \color{blue}{14} \\ \color{blue}{15} & \color{blue}{16} & \color{blue}{17} & \color{blue}{18} & \color{blue}{19} \\ \hline 20 & 21 & 22 & 23 & 24 \end{array} \]
#Aの2~4行目を取得
>>> A[1:4]
array([[ 5,  6,  7,  8,  9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]])

節はじめに戻る


(2)指定列の抽出

  • A[:, 列番号]
指定した1列を抽出できます。 列の場合は“:,”が指定列前に必要になります。 ここではAの5列目を抽出します。
\[ \begin{array}{cccc|c} 0 & 1 & 2 & 3 & \color{blue}4 \\ 5 & 6 & 7 & 8 & \color{blue} 9 \\ 10 & 11 & 12 & 13 & \color{blue}{14} \\ 15 & 16 & 17 & 18 & \color{blue}{19} \\ 20 & 21 & 22 & 23 & \color{blue}{24} \end{array} \]
#Aの5列目を取得
>>> A[:,4]
array([ 4,  9, 14, 19, 24])
  • A[:, [列番号, 列番号, 列番号, ...]]
複数列を個別に指定して抽出できます。 列番号の個別指定はリスト[*,*,*]で行います。 ここではAの3列目と4列目を抽出します。
\[ \begin{array}{cc|cc|c} 0 & 1 & \color{blue}2 & \color{blue}3 & 4 \\ 5 & 6 & \color{blue}7 & \color{blue}8 & 9 \\ 10 & 11 & \color{blue}{12} & \color{blue}{13} & 14 \\ 15 & 16 & \color{blue}{17} & \color{blue}{18} & 19 \\ 20 & 21 & \color{blue}{22} & \color{blue}{23} & 24 \end{array} \]
#Aの3、4列目を取得
>>> A[:, [2,3]]
array([[ 2,  3],
[ 7,  8],
[12, 13],
[17, 18],
[22, 23]])
  • A[:, 開始列番号:終了列番号]
連続する複数列を抽出できます (“:”指定時の完了番号は含まれません)。 ここではAの3~5列目を抽出します。
\[ \begin{array}{cc|ccc} 0 & 1 & \color{blue}2 & \color{blue}3 & \color{blue}4 \\ 5 & 6 & \color{blue}7 & \color{blue}8 & \color{blue}9 \\ 10 & 11 & \color{blue}{12} & \color{blue}{13} & \color{blue}{14} \\ 15 & 16 & \color{blue}{17} & \color{blue}{18} & \color{blue}{19} \\ 20 & 21 & \color{blue}{22} & \color{blue}{23} & \color{blue}{24} \end{array} \]
#Aの3~5列目を取得
>>> A[:, 2:5]
array([[ 2,  3,  4],
[ 7,  8,  9],
[12, 13, 14],
[17, 18, 19],
[22, 23, 24]])

節はじめに戻る


(3)指定要素の抽出

  • A[行番号, 列番号]
行/列番号を指定して要素を1つ抽出します。
例えば、Aの2行3列目の要素(7)を抽出します。
\[ \begin{array}{ccccc} 0 & 1 & 2 & 3 & 4 \\ 5 & 6 & \fbox{$\color{blue}{7}$} & 8 & 9 \\ 10 & 11 & 12 & 13 & 14 \\ 15 & 16 & 17 & 18 & 19 \\ 20 & 21 & 22 & 23 & 24 \end{array} \]
#Aの2行3列目(2, 3)を取得
>>> A[1,2]
7

>>> A[1][2]
7
  • A[[行番号, 行番号, 行番号, ...], [列番号, 列番号, 列番号, ...]]
複数の要素を抽出する場合、行、列をそれぞれリストで指定します。 このとき、行指定リストと列指定リストの指定数は同じでなければなりません。
例えば、Aの2行2列目(6)、3行3列目(12)、4行4列目(18)の要素を抽出します。
\[ \begin{array}{ccccc} 0 & 1 & 2 & 3 & 4 \\ 5 & \fbox{$\color{blue}{6}$} & 7 & 8 & 9 \\ 10 & 11 & \fbox{$\color{blue}{12}$} & 13 & 14 \\ 15 & 16 & 17 & \fbox{$\color{blue}{18}$} & 19 \\ 20 & 21 & 22 & 23 & 24 \end{array} \]
#Aの2行2列目、3行3列目、4行4列目の要素を取得
>>> A[[1,2,3],[1,2,3]]
array([ 6, 12, 18])

#行と列の指定数が一致しない場合はエラー
>>> A[[1,2,3],[2,3]]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (3,) (2,)
  • A[行番号:行番号, 列番号:列番号]
連続した行と連続した列を指定すると、共通部分の要素を取得できます。 ここではAの2~4行目と3~5列目の共通部(小行列)を抽出します。
\[ \begin{array}{cc|ccc} 0 & 1 & 2 & 3 & 4 \\ \hline 5 & 6 & \color{blue}7 & \color{blue}8 & \color{blue}9 \\ 10 & 11 & \color{blue}{12} & \color{blue}{13} & \color{blue}{14} \\ 15 & 16 & \color{blue}{17} & \color{blue}{18} & \color{blue}{19} \\ \hline 20 & 21 & 22 & 23 & 24 \end{array} \]
#Aの2~4行目と3~5列目の共通部を取得
>>> A[1:4, 2:5]
array([[ 7,  8,  9],
[12, 13, 14],
[17, 18, 19]])

節はじめに戻る


(4)抽出要素の変数への代入

実際の用途は、取得した配列を何かしらの変数に入れることになります。
#Aの2~3行目をBに入力
>>> B = A[1:3]
>>> B
array([[ 5,  6,  7,  8,  9],
[10, 11, 12, 13, 14]])
>>> type(B)	#Bの型はnumpy配列
<class 'numpy.ndarray'>

>>> C = np.array(A[1:3,2:5])
>>> C
array([[ 7,  8,  9],
[12, 13, 14]])
ただしNumpy配列は参照渡しであるため(値渡しではない)、元の配列要素を書き換えると、変数に引き当てた配列も書き換わります。
>>> A[1,0]
5
>>> A[1,0]=500
>>> A
array([[  0,   1,   2,   3,   4],
[500,   6,   7,   8,   9],
[ 10,  11,  12,  13,  14],
[ 15,  16,  17,  18,  18],
[ 20,  21,  22,  23,  24]])
>>> B
array([[500,   6,   7,   8,   9],
[ 10,  11,  12,  13,  14]])
値渡しにする場合は、copy()メソッドを使います。
  • B=A.copy()
#Aを元に戻して
>>> A[1,0]=5
>>> A
array([[ 0,  1,  2,  3,  4],
[ 5,  6,  7,  8,  9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 18],
[20, 21, 22, 23, 24]])

#copyメソッドを使う場合
>>> B = A[1:3].copy()
>>> B
array([[ 5,  6,  7,  8,  9],
[10, 11, 12, 13, 14]])

>>> A[1,0]=500
>>> A
array([[  0,   1,   2,   3,   4],
[500,   6,   7,   8,   9],
[ 10,  11,  12,  13,  14],
[ 15,  16,  17,  18,  18],
[ 20,  21,  22,  23,  24]])
>>> B
array([[ 5,  6,  7,  8,  9],
[10, 11, 12, 13, 14]])
#Bの要素は変わっていません。

節はじめに戻る

参考文献

関連ページ