回答編集履歴

3

追記

2021/08/27 08:20

投稿

bsdfan
bsdfan

スコア4774

test CHANGED
@@ -52,4 +52,22 @@
52
52
 
53
53
 
54
54
 
55
+
56
+
57
+ **■追記**
58
+
59
+
60
+
55
- **■ idxがXの範囲を超える場合のチェック入っていないので、必要応じて対応してください**
61
+ idxがXの範囲を超える(Y=1のあと5行ない)場合があるケース最後を下記変更ください
62
+
63
+ ```python
64
+
65
+ mask = idx < len(data['X'])
66
+
67
+ newData = pd.DataFrame({
68
+
69
+ 'X': data['X'].array[idx[mask]],
70
+
71
+ 'L': np.arange(len(idx))[mask] // N + 1})
72
+
73
+ ```

2

修正と追記

2021/08/27 08:20

投稿

bsdfan
bsdfan

スコア4774

test CHANGED
@@ -30,19 +30,17 @@
30
30
 
31
31
 
32
32
 
33
- y = data['Y'].array
33
+ idx0, = np.nonzero(data['Y'].array == 1)
34
-
35
- idx0, = np.nonzero(y == 1)
36
34
 
37
35
  idx = np.ravel(np.arange(N) + idx0[:, None])
38
36
 
39
37
 
40
38
 
41
- newData = pd.DataFrame()
39
+ newData = pd.DataFrame({
42
40
 
43
- newData["X"] = data['X'].array[idx]
41
+ 'X': data['X'].array[idx],
44
42
 
45
- newData["L"] = np.arange(len(idx)) // N + 1
43
+ 'L': np.arange(len(idx)) // N + 1})
46
44
 
47
45
  ```
48
46
 
@@ -51,3 +49,7 @@
51
49
  idx0 は numpy.nonzero() で y=1 のインデックス[0, 4, ...]をとりだしていて、
52
50
 
53
51
  idx は numpy のブロードキャストを使って [0, 1, 2, 3, 4, 4 + 0, 4 + 1, ...] を作っています。
52
+
53
+
54
+
55
+ **■ idxがXの範囲を超える場合のチェックが入っていないので、必要に応じて対応してください**

1

修正

2021/08/27 04:17

投稿

bsdfan
bsdfan

スコア4774

test CHANGED
@@ -30,7 +30,7 @@
30
30
 
31
31
 
32
32
 
33
- y = np.array(Y)
33
+ y = data['Y'].array
34
34
 
35
35
  idx0, = np.nonzero(y == 1)
36
36
 
@@ -40,7 +40,7 @@
40
40
 
41
41
  newData = pd.DataFrame()
42
42
 
43
- newData["X"] = data['X'].iloc[idx].values
43
+ newData["X"] = data['X'].array[idx]
44
44
 
45
45
  newData["L"] = np.arange(len(idx)) // N + 1
46
46