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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1124閲覧

python numpy多次元のsortについて

Renkon

総合スコア26

NumPy

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/01/15 13:46

3次元配列の3次元目を,ある2次元配列の持つ値の大きさでソートしたいです.

その時

python

1a_3d = np.random.rand(100,10,20) 2a_2d = np.random.rand(20,100) 3sort_col_index = np.argsort(a_2d, axis=0) 4a_sorted = a_3d[0,:,sort_col_index[:,0]]

のように行うと

python

1a_sorted.shape 2# (20, 10)

となり,a_3dの形が崩れてしまいます.
なぜなのでしょうか.

また,実際にはa_3dの1次元目(要素数は100)でforループにかけたく思います.
一体どのようなコードを書けばよろしいのでしょうか.

どうぞよろしくお願いいたします.

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

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

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

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

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

guest

回答1

0

ベストアンサー

python

1a_sorted.shape 2# (20, 10)

となり,a_3dの形が崩れてしまいます.
なぜなのでしょうか.

最後の添字表記で0番目の要素を取り出しているからです。

python

1# 元のコード 2# a_sorted = a_3d[0,:,sort_col_index[:,0]] 3 4# 改善 5# a_sorted = a_3d[:,:,sort_col_index[:,0]] # どうして:の代わりに0って書いたんだろう? 6# => a_sorted.shape : (100, 10, 20)

また,実際にはa_3dの1次元目(要素数は100)でforループにかけたく思います.
一体どのようなコードを書けばよろしいのでしょうか.

こういうことでしょうか?

python

1for x in a_3d: 2 ...

投稿2019/01/15 14:06

hayataka2049

総合スコア30933

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

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

Renkon

2019/01/15 14:15

実際には,100というのが試行回数となっていて a_3dの各試行ごとに列ベクトルをソートしたものを取得したく思います. ご回答いただいた ># 改善 ># a_sorted = a_3d[:,:,sort_col_index[:,0]] # どうして:の代わりに0って書いたんだろう? ># => a_sorted.shape : (100, 10, 20) こちらのコードでa_3dを各試行(1次元目)ごとに列ベクトルをソートした配列が得られるのでしょうか? 理解が浅く申し訳ありません.
hayataka2049

2019/01/15 14:45

ちょっと理解が追いついていないので整理させてください。 >a_3dの各試行ごとに列ベクトルをソートしたもの ということですが、その際に1回目の試行a_3d[0]に対して、sort_col_indexを使って書くとすると、 a_2dのshapeは(20, 100)ですが100が試行回数に相当し20がa_3dのaxis=2と相当するので a_sorted = a_3d[0,:,sort_col_index[:,0]] で0番目の試行の結果が得られるということですね。それなら確かに納得行きます。 でも実際には、配列全体のソートを一括で行いたいのですね。その場合は、私の回答のコードは間違いです(単にshapeを揃えただけという)。
Renkon

2019/01/16 07:53

返信が遅くなり申し訳ありません. >ということですが、その際に1回目の試行a_3d[0]に対して、sort_col_indexを使って書くとすると、 >a_2dのshapeは(20, 100)ですが100が試行回数に相当し20がa_3dのaxis=2と相当するので >a_sorted = a_3d[0,:,sort_col_index[:,0]] >で0番目の試行の結果が得られるということですね。それなら確かに納得行きます。 おっしゃる通りです. (10, 20)の配列を,axis=1つまり20個の列ベクトルをsort_col_indexでソートしたいです. これを全試行で行いたいので,質問に乗せたコードで良いかと思ったのですがいかがでしょうか. 要領を得ない質問をしてしまい恐縮です.
hayataka2049

2019/01/16 08:02

質門のコードはあくまでも0つめの試行の結果を得ているだけなので、全試行で行いたいのであれば間違っています。 たとえば np.array([a_3d[i,:,sort_col_index[:,i]] for i in range(100)]) のようにして全試行のソートされた結果を得られるはずです。
Renkon

2019/01/16 08:07

forで回す前に確認と思って0を代入するとa_sortedは(20, 10)の配列となっており, 期待していた(10, 20)の配列ではありませんでした. >np.array([a_3d[i,:,sort_col_index[:,i]] for i in range(100)]) こちらのコードでも同様に(100, 20, 10)の配列になるのですが なぜこうなってしまうのでしょうか?
Renkon

2019/01/16 08:45

np.array([a_3d[i][:,sort_col_index[:,i]] for i in range(100)]) 上記のようにindexの指定を切り分けることで(100, 10, 20)の配列を得ることができました. ありがとうございました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問