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

回答編集履歴

3

追記

2021/08/27 08:20

投稿

bsdfan
bsdfan

スコア4921

answer CHANGED
@@ -25,4 +25,13 @@
25
25
  idx0 は numpy.nonzero() で y=1 のインデックス[0, 4, ...]をとりだしていて、
26
26
  idx は numpy のブロードキャストを使って [0, 1, 2, 3, 4, 4 + 0, 4 + 1, ...] を作っています。
27
27
 
28
+
29
+ **■追記**
30
+
28
- **■ idxがXの範囲を超える場合チェックが入っていないで、必要応じて対応してください**
31
+ idxがXの範囲を超える(Y=1あと5行ない)場合があるケース最後を下記変更ください
32
+ ```python
33
+ mask = idx < len(data['X'])
34
+ newData = pd.DataFrame({
35
+ 'X': data['X'].array[idx[mask]],
36
+ 'L': np.arange(len(idx))[mask] // N + 1})
37
+ ```

2

修正と追記

2021/08/27 08:20

投稿

bsdfan
bsdfan

スコア4921

answer CHANGED
@@ -14,14 +14,15 @@
14
14
 
15
15
  N = 5
16
16
 
17
- y = data['Y'].array
17
+ idx0, = np.nonzero(data['Y'].array == 1)
18
- idx0, = np.nonzero(y == 1)
19
18
  idx = np.ravel(np.arange(N) + idx0[:, None])
20
19
 
21
- newData = pd.DataFrame()
20
+ newData = pd.DataFrame({
22
- newData["X"] = data['X'].array[idx]
21
+ 'X': data['X'].array[idx],
23
- newData["L"] = np.arange(len(idx)) // N + 1
22
+ 'L': np.arange(len(idx)) // N + 1})
24
23
  ```
25
24
 
26
25
  idx0 は numpy.nonzero() で y=1 のインデックス[0, 4, ...]をとりだしていて、
27
- idx は numpy のブロードキャストを使って [0, 1, 2, 3, 4, 4 + 0, 4 + 1, ...] を作っています。
26
+ idx は numpy のブロードキャストを使って [0, 1, 2, 3, 4, 4 + 0, 4 + 1, ...] を作っています。
27
+
28
+ **■ idxがXの範囲を超える場合のチェックが入っていないので、必要に応じて対応してください**

1

修正

2021/08/27 04:17

投稿

bsdfan
bsdfan

スコア4921

answer CHANGED
@@ -14,12 +14,12 @@
14
14
 
15
15
  N = 5
16
16
 
17
- y = np.array(Y)
17
+ y = data['Y'].array
18
18
  idx0, = np.nonzero(y == 1)
19
19
  idx = np.ravel(np.arange(N) + idx0[:, None])
20
20
 
21
21
  newData = pd.DataFrame()
22
- newData["X"] = data['X'].iloc[idx].values
22
+ newData["X"] = data['X'].array[idx]
23
23
  newData["L"] = np.arange(len(idx)) // N + 1
24
24
  ```
25
25