NumPy

NumPy Quickstart チュートリアルに取り組む (1-6) 基本 インデックス化、スライス、反復処理

一次元配列は、リストや他のPythonシーケンスのように、インデックスを付けたり、スライスしたり、繰り返せる。

import numpy as np

a = np.arange(10)**3
print(a)  # [  0   1   8  27  64 125 216 343 512 729]

print(a[2])  # 8

print(a[2:5])  # [ 8 27 64]

a[:6:2] = 1000
print(a)  # [1000    1 1000   27 1000  125  216  343  512  729]

print(a[::-1])  # [ 729  512  343  216  125 1000   27 1000    1 1000]

for i in a:
    print(i**(1/3.))
'''
9.999999999999998
1.0
9.999999999999998
3.0
9.999999999999998
5.0
5.999999999999999
6.999999999999999
7.999999999999999
8.999999999999998
'''

多次元配列は軸ごとに1つのインデックスを持つ。これらのインデックスは、カンマで区切られたタプルで与えられる。


def f(x, y):
    return 10*x+y


b = np.fromfunction(f, (5, 4), dtype=int)
print(b)
'''
[[ 0  1  2  3]
 [10 11 12 13]
 [20 21 22 23]
 [30 31 32 33]
 [40 41 42 43]]
'''

print(b[2, 3])  # 23

print(b[0:5, 1])  # [ 1 11 21 31 41]

print(b[:, 1])  # [ 1 11 21 31 41]

print(b[1:3, :])
'''
[[10 11 12 13]
 [20 21 22 23]]
'''

# 軸の数より少ないインデックスが提供されている場合、
# 欠落しているインデックスは完全なスライスとみなされる
print(b[-1])  # [40 41 42 43]

# NumPyでは、ドットを使ってb[i,….]のように書くこともできる
# ドット(….)は、完全なインデキシングタプルを生成するために必要な数だけコロンを表す
print(b[..., 1])  # [ 1 11 21 31 41]

# 多次元配列の反復処理は第1軸を基準にして行われる
for row in b:
    print(row)
'''
[0 1 2 3]
[10 11 12 13]
[20 21 22 23]
[30 31 32 33]
[40 41 42 43]
'''

# 配列の全要素に対するイテレータである flat 属性を使用すると良い
for element in b.flat:
    print(element)
'''
0
1
2
3
10
11
12
13
20
21
22
23
30
31
32
33
40
41
42
43
'''