質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

325閲覧

数字の羅列から条件を付けて平均値を出したい

SOSEKI

総合スコア5

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/07/29 06:13

編集2020/07/29 08:00

前提・実現したいこと

Pythonでデータの前処理をしたいと思っています。
一列にある整数が羅列されています。この数字の羅列から条件を付けて平均値を出したいです。
以下を列の最後まで続ける。
平均値を出す範囲を決める。条件は1以上をスタートとし、0が3回続いた時点を終わりとする。
この範囲内での平均値を出す(最後のゼロを除く)

例えば

[0,1,0,10,0,0,0,11,12,0,0,0,........]

1から10, 11から12までの各平均値を出していくのを終わりまで繰り返す、という感じです。

こういった事を可能ですか?
Pythonで無理なら他のどの言語ならできますか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

can110

2020/07/29 07:39

[~,0,1,2,0,0]とゼロが3回続かないでリストが終わった場合は、最後の平均値はどうなるのを期待していますか?
SOSEKI

2020/07/29 07:41

1~2の平均値を出すことを想定します。
guest

回答2

0

ベストアンサー

python

1import numpy as np 2 3def get_between_zeros(arr, N): 4 """最初に現れた0でない値から、その次の0がN連続するまでの間を取得 5 """ 6 arr = np.r_[arr, np.zeros(N, dtype=int)] # N連続0がない場合用 7 is_nonzero = arr != 0 8 9 # 始点=最初に現れた0以外の値の位置 10 s = is_nonzero.argmax() 11 # 始点より後ろで初めて0がN連続する箇所の位置 12 ln = np.convolve(is_nonzero[s:], np.ones(N, dtype=int), 'valid').argmin() 13 return arr[s:s+ln]

↓例

python

1a = np.array([0, 0, 1, 0, 14, 0, 0, 0]) 2N = 3 3out = get_between_zeros(a, N) 4 5out 6# array([ 1, 0, 14]) 7out.mean() 8# 5.0

python

1a = np.array([0, 1, 2, 3, 0, 1, 2, 3, 0, 0, 1, 2, 3, 0, 0, 0, 1, 2, 3]) 2get_between_zeros(a, 1) 3# array([1, 2, 3]) 4get_between_zeros(a, 2) 5# array([1, 2, 3, 0, 1, 2, 3]) 6get_between_zeros(a, 3) 7# array([1, 2, 3, 0, 1, 2, 3, 0, 0, 1, 2, 3]) 8get_between_zeros(a, 4) 9# array([1, 2, 3, 0, 1, 2, 3, 0, 0, 1, 2, 3, 0, 0, 0, 1, 2, 3])

追記(質問が変更されたので)

python

1def get_between_zeros(arr, N, return_index=False): 2 arr = np.r_[arr, np.zeros(N, dtype=int)] 3 is_nonzero = arr != 0 4 s = is_nonzero.argmax() 5 ln = np.convolve(is_nonzero[s:], np.ones(N, dtype=int), 'valid').argmin() 6 7 if return_index: 8 return arr[s:s+ln], (s, s+ln) 9 else: 10 return arr[s:s+ln] 11 12 13a = np.array([0, 1, 0, 10, 0, 0, 0, 11, 12, 0, 0, 0]) 14 15outs = [] 16for i in range(a.size): 17 out, (s, e) = get_between_zeros(a, 3, True) 18 outs.append(out.mean()) 19 a[:e] = 0 20 if a.sum() == 0: 21 break 22 23outs 24# [3.6666666666666665, 11.5]

投稿2020/07/29 07:21

編集2020/07/29 08:36
kirara0048

総合スコア1399

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SOSEKI

2020/07/29 08:41

このコードが理解できるように勉強します。 ありがとうございました!!!!
guest

0

可能です。
単純にforとif文でできそうですね。

投稿2020/07/29 06:19

jeanbiego

総合スコア3966

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問