Pythonでのタプルによるインデクシング方法
2次元配列
$A$を2次元配列としよう。すると$A[(y,x)]$と$A[y,x]$は同じ機能をする。
>>> import numpy as np
>>> A = np.arange(16).reshape(4,4)
>>> A
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
>>> A[2,3]
11
>>> A[(2,3)]
11
>>>
タプルのタプルを使うと、特定の複数インデックスを参照できる。ここで注意すべき点は、タプル内の最初のタプルは行(最初の次元)に対するインデックスであり、二番目のタプルは列(二番目の次元)に対するインデックスだということだ。従って、配列の[0,0]
, [1,1]
, [2,2]
の位置にそれぞれ1, 2, 3を入れたい場合、A[(0,0), (1,1), (2,2)] = [1, 2, 3]
ではなく、A[(0, 1, 2), (0, 1, 2)] = [1, 2, 3]
と入力する必要がある。
>>> A = np.zeros((3,3))
>>> A
array([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
>>> A[(0,0), (1,1), (2,2)] = [1, 2, 3]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: too many indices for array: array is 2-dimensional, but 3 were indexed
>>> A[(0, 1, 2), (0, 1, 2)] = [1, 2, 3]
>>> A
array([[1., 0., 0.],
[0., 2., 0.],
[0., 0., 3.]])
多次元配列
例えば、多次元配列で、各2次元配列の[0,0]
, [1,2]
, [2,3]
を参照したい場合、以下のように入力すればいい。
>>> A = np.zeros((3,4,4))
>>> A
array([[[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]],
[[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]],
[[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]]])
>>> A[:, (0, 1, 2), (0, 2, 3)] = [1, 3, 9]
>>> A
array([[[1., 0., 0., 0.],
[0., 0., 3., 0.],
[0., 0., 0., 9.],
[0., 0., 0., 0.]],
[[1., 0., 0., 0.],
[0., 0., 3., 0.],
[0., 0., 0., 9.],
[0., 0., 0., 0.]],
[[1., 0., 0., 0.],
[0., 0., 3., 0.],
[0., 0., 0., 9.],
[0., 0., 0., 0.]]])
環境
- OS: Windows10
- Python 3.9.2, Numpy 1.19.5