logo

Pythonでのタプルによるインデクシング方法 📂プログラミング

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