質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

3810閲覧

NumPyのorder引数について

yne

総合スコア1

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/07/25 19:14

疑問点

NumPyが提供している関数のオプション引数でorderを指定できるものが多々あると思いますが、
これの必要性がいまいち理解できていません。
※np.sort()のorderではなく、np.array()などで指定するorderのことです。

ネットにあるNumPyのサンプルでorderを使っているケースを私は見たことがないので、
何のために用意されているオプションなのか疑問に思っています。

  • そもそもorder引数は何のために存在するのでしょうか。
  • order指定をできることで何かメリットが得られるケースがありましたら、教えていただきたいです。

 (例えばorder=Fとしたときに何か利点があるのか)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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 02:48

編集2020/07/26 03:04
tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yne

2020/07/26 06:57

numpyがわざわざ配列のオーダーを設定出来るようにしているのは、Fortranで書かれた外部ライブラリとの連携を考えてのことなのでしょうか?numpyだけで完結するプログラムならCオーダーのみで困るケースはないように思えました。
tiitoi

2020/07/26 07:11

numpy バックエンドである BLAS や MLK で row-major や column-major を切り替えられるようになっているので、numpy のインタフェースとしても order で指定できるようになっていますが、普通の使い方をしていれば、この引数を使う機会というのはほぼないかと思います。
yne

2020/07/26 09:05

ありがとうございます。納得しました。
guest

0

投稿2020/07/25 23:03

ForestSeo

総合スコア2720

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問