ndarray の多次元配列の値は、内部的には1次元配列としてメモリ上に確保した領域に格納されています。その格納順が order
で、次の2種類があります。
Row-major orderとColumn-major order - Qiita
- "C": 行優先順 (row-major order) (numpy のデフォルト、C は C 言語で使われる順番の意味)
- "F": 列優先順 (column-major order、F は Fortran 言語で使われる順番の意味)
python
1import numpy as np
2
3x = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]], order="C")
4print(x.flags)
5# C_CONTIGUOUS : True
6# F_CONTIGUOUS : False
7# OWNDATA : True
8# WRITEABLE : True
9# ALIGNED : True
10# WRITEBACKIFCOPY : False
11# UPDATEIFCOPY : False
12
13x = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]], order="F")
14print(x.flags)
15# C_CONTIGUOUS : False
16# F_CONTIGUOUS : True
17# OWNDATA : True
18# WRITEABLE : True
19# ALIGNED : True
20# WRITEBACKIFCOPY : False
21# UPDATEIFCOPY : False
また、ravel() など一部の関数にも order
引数があり、これは配列の値にアクセスする順番を行優先順とするか、列優先順とするかの指定になります。
python
1import numpy as np
2
3x = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]], order="C")
4print(x.ravel("K")) # [1 2 3 4 5 6 7 8 9] # 行優先順
5
6
7x = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]], order="F")
8print(x.ravel("K")) # [1 4 7 2 5 8 3 6 9] # 列優先順
python
1import numpy as np
2
3x = np.array(range(9))
4print(x.reshape(3, 3, order="C"))
5# [[0 1 2]
6# [3 4 5]
7# [6 7 8]]
8
9x = np.array(range(9))
10print(x.reshape(3, 3, order="F")) # x.reshape(3, 3).T と同じ
11# [[0 3 6]
12# [1 4 7]
13# [2 5 8]]
"C"、"F" 以外に以下が指定できます。
- "K": ndarray に設定されているのと同じ順番
- "A": メモリ上に配置されているのと同じ順番
そもそもorder引数は何のために存在するのでしょうか。
order指定をできることで何かメリットが得られるケースがありましたら、教えていただきたいです。(例えばorder=Fとしたときに何か利点があるのか)
実用上、order を意識して使う機会はあまりないと思います。
numpy は計算部分は C 言語で書いたプログラムを使用することで高速化しています。C 言語の知識があると、型 (int32、int64、...)、order 引数、view といった概念を理解しやすくなると思います。例えば、numpy.lib.stride_tricks.as_strided のような関数を使うには、これらの知識が必須になります。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/26 06:57
2020/07/26 07:11
2020/07/26 09:05