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

スポンサーリンク