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

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

新規登録して質問してみよう
ただいま回答率
85.35%
多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Python

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

859閲覧

python 二次元データ ソート

bobslay

総合スコア32

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Python

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/09/30 07:22

pythonで次のコードのようになっている二次元のジャグ配列のデータを小さい順に取り出したいです.
また取り出した要素の添字も取り出したデータと同じ順番で並べたものも取得したいです.
次のコードでは,二次元配列はndarrayのリストになっていますが,単純な多重リストの方が速く実装できるのであれば,そちらの方法でも構いません.

python

1import numpy as np 2 3a = np.array([0.4, 0.8, 2.3]) 4b = np.array([0.3, 0.6]) 5c = np.array([2, 2.1, 3.4, 4.4]) 6d = np.array([0.4, 0.7]) 7 8abcd = [a, b, c, d] 9 10〜〜〜ここでソートを実行〜〜〜 11 12得たい結果 13result1 = [0.3, 0.4, 0.6, 0.7, 0.8, 2, 2.1, 2.3, 3.4, 4.4] 14result2 = [[1], [0, 3], [1], [3], [0], [2], [2], [0], [2], [2]]

実際に使用する際にはさらに大きなデータで実行したいと考えているので,できるだけ高速なコードが知りたいです.お願いいたします.

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/09/30 07:29

「得たい結果」の2つ目のリスト result2 の二番目の要素 [0, 3] は何を表しているのでしょうか?
bobslay

2021/09/30 07:40

0.4という値が0番目(a)・3番目(b)どちらにもあるので,同率ということで[0,3]という書き方をしています.わかりにくく申し訳ありません.
退会済みユーザー

退会済みユーザー

2021/09/30 07:42

ご回答ありがとうございます。なるほど、そういう意味ですね。了解しました。
guest

回答3

0

numpyでやってみました。
argsortしたあとuniqueという似たような処理を2回やっているので、ちょっと無駄が多いかもしれないのですが、同率の組み合わせを作るためにやっています。
pandasのgroupbyや、itertools.groupbyでもできると思います。

python

1import numpy as np 2 3a = np.array([0.4, 0.8, 2.3]) 4b = np.array([0.3, 0.6]) 5c = np.array([2, 2.1, 3.4, 4.4]) 6d = np.array([0.4, 0.7]) 7 8abcd = [a, b, c, d] 9 10arr = np.concatenate(abcd) 11group = np.concatenate([[i] * len(x) for i, x in enumerate(abcd)]) 12 13sort_idx = np.argsort(arr) 14arr_sorted = arr[sort_idx] 15grp_sorted = group[sort_idx] 16 17result1, uniq_idx = np.unique(arr_sorted, return_index=True) 18result2 = np.split(grp_sorted, uniq_idx[1:]) 19 20print(result1) 21# [0.3 0.4 0.6 0.7 0.8 2. 2.1 2.3 3.4 4.4] 22print(result2) 23# [array([1]), array([0, 3]), array([1]), array([3]), array([0]), array([2]), array([2]), array([0]), array([2]), array([2])]

投稿2021/09/30 13:07

bsdfan

総合スコア4794

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

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

kirara0048

2021/10/01 01:05

group = np.arange(len(abcd)).repeat([*map(len, abcd)]) のほうが良いかもしれません。
bsdfan

2021/10/01 01:45

kirara0048さん、ありがとうございます。 arangeとrepeatを組み合わせて書けますね。思いつきませんでした。勉強になります。
guest

0

これでどうでしょう?

python

1import numpy as np 2from collections import defaultdict 3 4 5a = np.array([0.4, 0.8, 2.3]) 6b = np.array([0.3, 0.6]) 7c = np.array([2, 2.1, 3.4, 4.4]) 8d = np.array([0.4, 0.7]) 9abcd = [a, b, c, d] 10 11data_map = defaultdict(list) 12 13for idx, ls in enumerate(abcd): 14 for v in ls: 15 data_map[v].append(idx) 16 17 18result1 = sorted(data_map.keys()) 19result2 = [data_map[v] for v in result1] 20 21print(result1) # => [0.3, 0.4, 0.6, 0.7, 0.8, 2.0, 2.1, 2.3, 3.4, 4.4] 22print(result2) # => [[1], [0, 3], [1], [3], [0], [2], [2], [0], [2], [2]] 23

投稿2021/09/30 09:01

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ベストアンサー

以下です。

python

1>>> a = [0.4, 0.8, 2.3] 2>>> b = [0.3, 0.6] 3>>> c = [2, 2.1, 3.4, 4.4] 4>>> d = [0.4, 0.7] 5>>> 6>>> abcd = [a, b, c, d] 7>>> 8>>> all_set = {} 9>>> for i, lst in enumerate(abcd): 10... for x in lst: 11... if x in all_set: 12... all_set[x].append(i) 13... else: 14... all_set[x] = [i] 15... 16>>> all_list = sorted(all_set.items(), key=lambda item: item[0]) 17>>> 18>>> result1 = [x for x, y in all_list] 19>>> result2 = [y for x, y in all_list] 20>>> print(result1) 21[0.3, 0.4, 0.6, 0.7, 0.8, 2, 2.1, 2.3, 3.4, 4.4] 22>>> print(result2) 23[[1], [0, 3], [1], [3], [0], [2], [2], [0], [2], [2]]

追加回答

なるべく、機械命令で実行する部分を増やすために、numpyとpandasを使った方法です。
numpyを使っているため、「0.4という値が0番目(a)・3番目(b)どちらにもあるので,同率ということで[0,3]という書き方」はやっていません。それをやると遅くなります。

python

1>>> import numpy as np 2>>> import pandas as pd 3>>> 4>>> a = np.array([0.4, 0.8, 2.3]) 5>>> b = np.array([0.3, 0.6]) 6>>> c = np.array([2, 2.1, 3.4, 4.4]) 7>>> d = np.array([0.4, 0.7]) 8>>> 9>>> abcd = [a, b, c, d] 10>>> 11>>> num_elements = sum([len(e) for e in abcd]) 12>>> all_array = np.zeros(2 * num_elements).reshape(num_elements, 2) 13>>> 14>>> start = 0 15>>> for i, a in enumerate(abcd): 16... end = start + len(a) 17... all_array[start:end, 0] = a 18... all_array[start:end, 1] = i 19... start = end 20... 21>>> df = pd.DataFrame(all_array) 22>>> df.sort_values(0, inplace=True) 23>>> print(df) 24 0 1 253 0.3 1.0 260 0.4 0.0 279 0.4 3.0 284 0.6 1.0 2910 0.7 3.0 301 0.8 0.0 315 2.0 2.0 326 2.1 2.0 332 2.3 0.0 347 3.4 2.0 358 4.4 2.0 36>>> result1 = df[0].values 37>>> result2 = df[1].values.astype(int) 38>>> print(result1) 39[0.3 0.4 0.4 0.6 0.7 0.8 2. 2.1 2.3 3.4 4.4] 40>>> print(result2) 41[1 0 3 1 3 0 2 2 0 2 2]

最初の回答よりは速いと思います。

投稿2021/09/30 07:56

編集2021/09/30 10:08
ppaul

総合スコア24670

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

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

bobslay

2021/09/30 08:37

ご回答ありがとうございます. ただいま実際に使用したいデータに対して実行してみたところ,やはりndarrayをリストに変換するのに時間がかかってしまいました. tolist()関数を用いて二次元配列の内側の要素を一つずつ変換しているので遅いと思うのですが,何か他に良い方法はあるでしょうか? もしくは,やはり質問文のコードのデータ形式のまま高速にソートする方法はありますでしょうか?
ppaul

2021/09/30 09:29

ndarrayをリストに変換しなくても、同じコードで動きます。 しかし、それほど速くはならないでしょう。 ちょっと考えてみますが、numpyだけでできるかというと難しそうです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問