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]]
