teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

コメントに対して追加回答

2021/09/30 10:08

投稿

ppaul
ppaul

スコア24672

answer CHANGED
@@ -24,4 +24,54 @@
24
24
  [0.3, 0.4, 0.6, 0.7, 0.8, 2, 2.1, 2.3, 3.4, 4.4]
25
25
  >>> print(result2)
26
26
  [[1], [0, 3], [1], [3], [0], [2], [2], [0], [2], [2]]
27
- ```
27
+ ```
28
+
29
+ 追加回答
30
+
31
+ なるべく、機械命令で実行する部分を増やすために、numpyとpandasを使った方法です。
32
+ numpyを使っているため、「0.4という値が0番目(a)・3番目(b)どちらにもあるので,同率ということで[0,3]という書き方」はやっていません。それをやると遅くなります。
33
+
34
+ ```python
35
+ >>> import numpy as np
36
+ >>> import pandas as pd
37
+ >>>
38
+ >>> a = np.array([0.4, 0.8, 2.3])
39
+ >>> b = np.array([0.3, 0.6])
40
+ >>> c = np.array([2, 2.1, 3.4, 4.4])
41
+ >>> d = np.array([0.4, 0.7])
42
+ >>>
43
+ >>> abcd = [a, b, c, d]
44
+ >>>
45
+ >>> num_elements = sum([len(e) for e in abcd])
46
+ >>> all_array = np.zeros(2 * num_elements).reshape(num_elements, 2)
47
+ >>>
48
+ >>> start = 0
49
+ >>> for i, a in enumerate(abcd):
50
+ ... end = start + len(a)
51
+ ... all_array[start:end, 0] = a
52
+ ... all_array[start:end, 1] = i
53
+ ... start = end
54
+ ...
55
+ >>> df = pd.DataFrame(all_array)
56
+ >>> df.sort_values(0, inplace=True)
57
+ >>> print(df)
58
+ 0 1
59
+ 3 0.3 1.0
60
+ 0 0.4 0.0
61
+ 9 0.4 3.0
62
+ 4 0.6 1.0
63
+ 10 0.7 3.0
64
+ 1 0.8 0.0
65
+ 5 2.0 2.0
66
+ 6 2.1 2.0
67
+ 2 2.3 0.0
68
+ 7 3.4 2.0
69
+ 8 4.4 2.0
70
+ >>> result1 = df[0].values
71
+ >>> result2 = df[1].values.astype(int)
72
+ >>> print(result1)
73
+ [0.3 0.4 0.4 0.6 0.7 0.8 2. 2.1 2.3 3.4 4.4]
74
+ >>> print(result2)
75
+ [1 0 3 1 3 0 2 2 0 2 2]
76
+ ```
77
+ 最初の回答よりは速いと思います。