Pythonのスライスを使った配列操作はとても便利です。
今回は、numpy配列を例にとって、使い方をご紹介します。
スポンサーリンク
Pythonのスライスの表記方法
1次元のnumpy配列の場合
スライスを使った操作方法は、下記の形式で書きます。
配列arrayのAからB-1番目のインデックスの要素にアクセスできます。
array[A: B]
A:開始インデックス B:終了インデックス
スポンサーリンク
1次元のnumpy配列のサンプルコード
1次元のnumpy配列を定義して、スライスで参照してprint出力しています。
$ cat sample.py #!/usr/bin/env python3 # coding: UTF-8 import numpy as np #1次元でnumpy配列を生成 npArray = np.array([3, 4, 5, 6, 7, 8]) print("全ての配列の要素を出力") print(npArray) print(npArray[:]) print("indexが0~2の配列を要素を出力") print(npArray[0:3])
下記が実行結果になります。
$ ./sample.py 全ての配列の要素を出力 [3 4 5 6 7 8] [3 4 5 6 7 8] indexが0~2の配列を要素を出力 [3 4 5]
2次元のnumpy配列の場合
2次元配列の場合は、下記の形式でスライスを書きます。
配列arrayの行については、AからB-1番目のインデックスの要素にアクセスできます。
列については、CからD-1番目のインデックスの要素にアクセスできます。
array[A: B][C: D]
A:開始インデックス B:終了インデックス
C:開始インデックス D:終了インデックス
2次元のnumpy配列の使い方の例
2次元を例にいくつかご紹介します。
2次元配列の操作を例にして、いくつかPythonのサンプルコードを紹介したいと思います。
全ての行と列にアクセスする場合は、下記のように、":"のみ記載すればOKです。
npArray[:, :]
行は先頭1行のみ 列は全ての列にアクセスする場合。
npArray[0:1, :]
行は全ての行を対象とし、列は先頭1列のみにアクセスする場合。
npArray[:, 0:1]
行は全ての行を対象とし、列は先頭2列のみにアクセスする場合。
npArray[:, 0:2]
2次元のnumpy配列のサンプルコード
下記にPythonのスライスのサンプルコードをご紹介します。
下記のように、csvファイルがあったとします。
$ cat in.csv 1,1.4,5 2,1.5,6 3,4.7,7
まずは、loadtxtでcsvファイルを読み込んで、配列npArrayに格納します。
その後、先程のスライスの使い方の例に沿って、npArrayの要素をprint出力します。
$ cat sample.py #!/usr/bin/env python3 # coding: UTF-8 import numpy as np npArray = np.loadtxt("in.csv", delimiter = ",", dtype = "float") print("全ての配列の要素を出力") print(npArray) print("全ての行と列を出力") print(npArray[:, :]) print("行は先頭1行のみ 列は全てを列を出力") print(npArray[0:1, :]) print("行は全ての行を対象とし、列は先頭1列のみを出力") print(npArray[:, 0:1]) print("行は全ての行を対象とし、列は先頭2列のみを出力") print(npArray[:, 0:2])
実行すると、下記のように、スライスで指定した行と列が出力されているのが確認できます。
$ ./sample.py 全ての配列の要素を出力 [[ 1. 1.4 5. ] [ 2. 1.5 6. ] [ 3. 4.7 7. ]] 全ての行と列を出力 [[ 1. 1.4 5. ] [ 2. 1.5 6. ] [ 3. 4.7 7. ]] 行は先頭1行のみ 列は全てを列を出力 [[ 1. 1.4 5. ]] 行は全ての行を対象とし、列は先頭1列のみを出力 [[ 1.] [ 2.] [ 3.]] 行は全ての行を対象とし、列は先頭2列のみを出力 [[ 1. 1.4] [ 2. 1.5] [ 3. 4.7]]
スポンサーリンク
numpy配列へのスライスを使った代入方法(ブロードキャスト)
スライスで指定した部分配列に、ブロードキャストで値を代入することができます。
1次元のnumpy配列
下記の形式で、配列arrayのAからB-1番目のインデックスの要素に、Cを代入します。
array[A: B] = C
下記が、サンプルコードになります。
$ cat sample.py #!/usr/bin/env python3 # coding: UTF-8 import numpy as np #1次元でnumpy配列を生成 npArray = np.array([3, 4, 5, 6, 7, 8]) print("全ての配列の要素を出力") print(npArray) print("indexが1~3の配列を要素に、ブロードキャストで1を代入") npArray[1:4] = 1 print(npArray)
下記が実行結果になります。
$ ./sample.py 全ての配列の要素を出力 [3 4 5 6 7 8] indexが1~3の配列を要素に、ブロードキャストで1を代入 [3 1 1 1 7 8]
2次元のnumpy配列
下記の形式で、AからB-1番目の行のインデックスの要素、CからD-1番目のインデックスの要素に、Eを代入します。
array[A: B][C: D] = E
下記が、サンプルコードになります。
$ cat sample.py #!/usr/bin/env python3 # coding: UTF-8 import numpy as np #2次元でnumpy配列を生成 npArray = np.array( [[0, 1, 2], [3, 4, 5], [6, 7, 8]]) print("全ての配列の要素を出力") print(npArray) print("1行目の要素に、ブロードキャストで9を代入") npArray[0:1, :] = 9 print(npArray) print("2列目の要素に、ブロードキャストで10を代入") npArray[:, 2:3] = 10 print(npArray)
下記が実行結果になります。
$ ./sample.py 全ての配列の要素を出力 [[0 1 2] [3 4 5] [6 7 8]] 1行目の要素に、ブロードキャストで9を代入 [[9 9 9] [3 4 5] [6 7 8]] 2列目の要素に、ブロードキャストで10を代入 [[ 9 9 10] [ 3 4 10] [ 6 7 10]]
スポンサーリンク