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

回答編集履歴

2

2020/07/17 04:29

投稿

kirara0048
kirara0048

スコア1399

answer CHANGED
@@ -9,7 +9,7 @@
9
9
  lens = np.array([len(arr) for arr in arrs])
10
10
 
11
11
  idx = cartesian([np.arange(length) for length in lens])
12
- offset = np.concatenate(([0], lens.cumsum()[:-1]))
12
+ offset = lens.cumsum() - lens
13
13
 
14
14
  new_arr = np.vstack(arrs)[idx+offset].reshape(-1, 2*len(df_list))
15
15
  return pd.DataFrame(new_arr, columns=np.concatenate(

1

追記

2020/07/17 04:29

投稿

kirara0048
kirara0048

スコア1399

answer CHANGED
@@ -1,4 +1,4 @@
1
- コードを整理すればもっといい方法があるかもしれませんが、いかがでしょうか。`itertools.product`より速いと思われます(特に各要素が数値なら)。
1
+ コードを整理すればもっといい方法があるかもしれませんが、以下の方法でいかがでしょうか。`itertools.product`より速いと思われます(特に各要素が数値なら)。
2
2
 
3
3
  ```python
4
4
  from sklearn.utils.extmath import cartesian
@@ -16,7 +16,7 @@
16
16
  [df.columns.to_numpy() for df in df_list]))
17
17
  ```
18
18
 
19
- 動作確認
19
+ ## 動作確認
20
20
 
21
21
  ```python
22
22
  In [11]: l_1 = [[1, 2], [3, 4]]
@@ -107,4 +107,36 @@
107
107
  7 1 2 11 22 333 444 3333 4444 33333 44444
108
108
  8 1 2 33 44 111 222 1111 2222 11111 22222
109
109
  # (後略)
110
+ ```
111
+
112
+ ## 速度比較
113
+
114
+ ```python
115
+ In [21]: def df_product_itertools(df_list):
116
+ : lsts = [df.to_numpy().tolist() for df in df_list]
117
+ : new_list = [reduce(add, e) for e in itertools.product(*lsts)]
118
+ : return pd.DataFrame(new_list, columns=np.concatenate(
119
+ : [df.columns.to_numpy() for df in df_list]))
120
+
121
+ In [22]: l_1 = [[1, 2], [3, 4]]
122
+ : l_2 = [[11, 22], [33, 44]]
123
+ : l_3 = [[111, 222], [333, 444]]
124
+ : l_4 = [[1111, 2222], [3333, 4444]]
125
+ : l_5 = [[11111, 22222], [33333, 44444]]
126
+ :
127
+ : df1 = pd.DataFrame(l_1, columns=['A', 'B'])
128
+ : df2 = pd.DataFrame(l_2, columns=['C', 'D'])
129
+ : df3 = pd.DataFrame(l_3, columns=['E', 'F'])
130
+ : df4 = pd.DataFrame(l_4, columns=['G', 'H'])
131
+ : df5 = pd.DataFrame(l_5, columns=['I', 'J'])
132
+
133
+ In [23]: %timeit df_product([df1, df2, df3, df4])
134
+ : %timeit df_product_itertools([df1, df2, df3, df4])
135
+ 355 µs ± 18.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
136
+ 928 µs ± 16.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
137
+
138
+ In [24]: %timeit df_product([df1, df2, df3, df4, df5])
139
+ : %timeit df_product_itertools([df1, df2, df3, df4, df5])
140
+ 378 µs ± 12.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
141
+ 1.12 ms ± 17.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
110
142
  ```