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

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

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

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

Python

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

Q&A

解決済

2回答

1615閲覧

Python/Numpy 関数の使用方法の違い

zarakima

総合スコア15

NumPy

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

Python

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

1グッド

0クリップ

投稿2018/01/10 03:24

Numpyで、ソート操作に関する関数が2種類ありますが、
ある定義済みのNumpy配列(arrとします)について

argsort()を使用する際は
arr.argsort()

sort()を使用する際は、
np.sort(arr)

と、記述方法に違いがあるのはなぜなのでしょうか。
この関数にはこの方法、と見分ける基準がありましたらご教示ください。

python 3.6.3
Numpy 1.13.1
Jupyter Notebook 5.0.0

LouiS0616👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

argsortは並び替えたときのインデックスを返します。

sortは並べ替えた結果を返します。


np.argsort(a) == a.argsort()です。


a.sort()はaを並び替えたものをaに入れます。返り値はNoneです。
元のものは上書きされます。
メモリを節約できます。

np.sort(a)はaを並び替えたものを返り値として戻します。この際コピーがされます。
代入したいのであれば、a = np.sort(a)をする必要があります。
b = np.sort(a)とすればaに並び替える前のものがあります。


状況に応じて使ってください。

投稿2018/01/10 04:11

mkgrei

総合スコア8560

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

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

zarakima

2018/01/10 05:44

ご回答ありがとうございます。 本当に数秒差ですが、こちらの回答が早かったのでベストアンサーとさせていただきます。
namnium1125

2018/01/10 05:57

数分差ですよ(苦笑) 私の方がごちゃごちゃしてわかりづらいので、mkgrei様がbaで当然です(^ ^;
mkgrei

2018/01/10 06:36

ありがとうございます。 内容は同じなので、興味を持ったことをきっかけになにかと得るものがあれば幸いです。 ちなみにですが、numpy/core/fromnumeric.pyにnp.argsortとnp.sortの実装があります。 こちらはPythonで実装されていて、第一引数に渡されたオブジェクトに実装された対応メソッドを呼びます。 argsortの場合はそのままobject.argsortをコールしていて、 sortの場合は先にコピーを作ってから、コピーに対してsortをコールします。 ですので、コールが二回分多いです。 またa=np.sort(a)でも一度はコピーがされるので、メモリ消費とコピーの時間がかかります。 ここでお気づきかもしれません。 object.argsortが実装されていることがnp.argsortが実行できる第一条件です。 では実装されていないとどうなるのでしょうか。 その場合まずnp.asarray(object)によってnp.arrayへのキャストが起こります。 そして、キャストが成功すればnp.arrayとしてargsortメソッドが呼ばれます。 リストを渡してもなんとかしてくれるのはこれによります。 array.sortとarray.argsortはCで実装されています。 元の配列が消えてもよいのならこちらの方が速いはずです。 ただ、案外思いもよらないところで実は消えてはいけなかったりします。 以下のコードでaの最初の4つの要素を取り出しておいてから、aを並べ替えてみます。 すると、取り出したと思われた4つの要素がいつの間にかすり替わっています。 想定外の振る舞いはこういったところから来たりします。 import numpy as np a = np.random.rand(10) b = a[:4] print(b) a.sort() print(b)
namnium1125

2018/01/10 07:02

なるほど、キャストが生じているんですね。クラスメソッドとか適当なことを書きました。すみません^_^; (helpをみるとselfがなかったので勘違いしてしまいました…@classmethodって書いてませんよね…)
guest

0

np.argsort(arr)もできますし、arr.sort()もできますよ。

argsortの方はどちらの書き方でも処理に違いはないみたいですが~~(厳密な部分は違うのだろうか?)~~※、sortの方には違いがあります。

  • np.sort(arr) -> 返り値が並べ替えられた新しいオブジェクトになる。元の配列には変化なし。
  • arr.sort() -> 配列そのものの中身を並べ換える。返り値は**None**

以下違いを示すコードです。

python

1import numpy as np 2 3arr_a = np.array([6,1,5,2,4,3]) 4arr_b = np.sort(arr_a) 5 6print('np.sort(arr_a) :') 7print('arr_a :',arr_a) 8print('arr_b :',arr_b) 9 10arr_a.sort() 11 12print('\narr_a.sort() :') 13print('arr_a :',arr_a)

実行結果

np.sort(arr_a) : arr_a : [6 1 5 2 4 3] arr_b : [1 2 3 4 5 6] arr_a.sort() : arr_a : [1 2 3 4 5 6]

追記 ※の部分について

こういうときに「同じだけど違う」という言葉を使いたくなってしまいますね。(^ ^;

全く等価なのは、mkgrei様も挙げておられる、

arr.argsort()np.argsort(arr)

ですね。これらは全く同じです。というかarr.argsort()が内部的にはnp.argsort(arr)になる、と言った方がいいのでしょうか?

しかし、クラスメソッドであるnp.argsort()自体は**numpy.ndarrayオブジェクト以外の配列**も引数に取ることができます。それが唯一の違いです。

python

1print(np.argsort([6,1,5,2,4,3])) # => [1 3 5 4 2 0] このように普通のリストも引数にとれる 2[6,1,5,2,4,3].argsort() # => AttributeError

投稿2018/01/10 04:14

編集2018/01/10 05:12
namnium1125

総合スコア2043

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

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

namnium1125

2018/01/10 04:18

ちなみに回答とは関係ないですが、`sort`の違いに関しては、組み込み関数、組み込み型では`sorted()`と`arr.sort()`の違いにあたります。
zarakima

2018/01/10 05:43

ご回答ありがとうございます。 詳細な例がたくさんあり、今後に役立ちそうで嬉しいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問