回答編集履歴

1

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

2021/09/30 10:08

投稿

ppaul
ppaul

スコア24670

test CHANGED
@@ -51,3 +51,103 @@
51
51
  [[1], [0, 3], [1], [3], [0], [2], [2], [0], [2], [2]]
52
52
 
53
53
  ```
54
+
55
+
56
+
57
+ 追加回答
58
+
59
+
60
+
61
+ なるべく、機械命令で実行する部分を増やすために、numpyとpandasを使った方法です。
62
+
63
+ numpyを使っているため、「0.4という値が0番目(a)・3番目(b)どちらにもあるので,同率ということで[0,3]という書き方」はやっていません。それをやると遅くなります。
64
+
65
+
66
+
67
+ ```python
68
+
69
+ >>> import numpy as np
70
+
71
+ >>> import pandas as pd
72
+
73
+ >>>
74
+
75
+ >>> a = np.array([0.4, 0.8, 2.3])
76
+
77
+ >>> b = np.array([0.3, 0.6])
78
+
79
+ >>> c = np.array([2, 2.1, 3.4, 4.4])
80
+
81
+ >>> d = np.array([0.4, 0.7])
82
+
83
+ >>>
84
+
85
+ >>> abcd = [a, b, c, d]
86
+
87
+ >>>
88
+
89
+ >>> num_elements = sum([len(e) for e in abcd])
90
+
91
+ >>> all_array = np.zeros(2 * num_elements).reshape(num_elements, 2)
92
+
93
+ >>>
94
+
95
+ >>> start = 0
96
+
97
+ >>> for i, a in enumerate(abcd):
98
+
99
+ ... end = start + len(a)
100
+
101
+ ... all_array[start:end, 0] = a
102
+
103
+ ... all_array[start:end, 1] = i
104
+
105
+ ... start = end
106
+
107
+ ...
108
+
109
+ >>> df = pd.DataFrame(all_array)
110
+
111
+ >>> df.sort_values(0, inplace=True)
112
+
113
+ >>> print(df)
114
+
115
+ 0 1
116
+
117
+ 3 0.3 1.0
118
+
119
+ 0 0.4 0.0
120
+
121
+ 9 0.4 3.0
122
+
123
+ 4 0.6 1.0
124
+
125
+ 10 0.7 3.0
126
+
127
+ 1 0.8 0.0
128
+
129
+ 5 2.0 2.0
130
+
131
+ 6 2.1 2.0
132
+
133
+ 2 2.3 0.0
134
+
135
+ 7 3.4 2.0
136
+
137
+ 8 4.4 2.0
138
+
139
+ >>> result1 = df[0].values
140
+
141
+ >>> result2 = df[1].values.astype(int)
142
+
143
+ >>> print(result1)
144
+
145
+ [0.3 0.4 0.4 0.6 0.7 0.8 2. 2.1 2.3 3.4 4.4]
146
+
147
+ >>> print(result2)
148
+
149
+ [1 0 3 1 3 0 2 2 0 2 2]
150
+
151
+ ```
152
+
153
+ 最初の回答よりは速いと思います。