下記のようなarray型の要素があります。符号がプラスの値が最大何回連続したか、マイナスの値が最大何回連続したかを抽出したです。
下記の例だと、プラスは3回、マイナスが2回となるイメージです。
[0.1,0.5,0.03,-019,-0.05,0.1,0.5,-0.2]
ご教示頂けると幸いです。
どうぞよろしくお願い致します。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/04/08 04:17
回答5件
0
ベストアンサー
とりあえず『連続した回数』を取り出す方法。
Python
1from itertools import groupby 2 3src = [0.1, 0.5, 0.03, -0.19, -0.05, 0.1, 0.5, -0.2] 4dst = [sum(1 for e in it) for _, it in groupby(src, key=lambda x: x > 0)] 5print(dst)
実行結果 Wandbox
[3, 2, 2, 1]
この中から正の値、負の値それぞれの連続する最大長を得たいの~~でしょうか?~~ですね。
それぞれmax(dst[0::2])
およびmax(dst[1::2])
で取得できます。
先頭の要素の正負に応じて使い分ければ良いです。
投稿2018/04/07 08:56
編集2018/04/07 09:03総合スコア35668
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/04/07 09:22 編集
2018/04/07 09:27
2018/04/07 09:38
2018/04/07 10:28
2018/04/07 10:34
2018/04/07 10:36
2018/04/07 10:39
2018/04/07 10:39
0
正負を1と-1に変換しておくことで、maxと-minで取り出せるというアイデアです。
python
1>>> lst = [0.1,0.5,0.03,-0.19,-0.05,0.1,0.5,-0.2] 2>>> result = [sum(item) for val, item in groupby([1 if x > 0 else -1 for x in lst])] 3>>> max(result) 43 5>>> -min(result) 62
投稿2018/04/07 10:38
総合スコア30935
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/04/08 01:02
2018/04/08 02:22
2018/04/08 02:27
2018/04/08 02:47
2018/04/08 04:22
2018/04/08 05:01 編集
2018/04/08 05:06
2018/04/08 20:34
0
すでに回答が出てますが、せっかく考えたのでこんな方法もあるということで。
同一符号の場合は、カウントアップ(ダウン)するやりかたです。
python
1test_list = [0.1, 0.5, 0.03, -0.19, -0.05, 0.1, 0.5, -0.2] 2tmp_list = [0 for i in range(len(test_list))] 3step = 0 4for i, dat in enumerate(test_list): 5 if dat > 0.0: 6 if step < 0: 7 step = 0 8 tmp_list[i] += 1 + step 9 step += 1 10 else: 11 if step > 0: 12 step = 0 13 tmp_list[i] += -1 + step 14 step += -1 15plus_counter = max(tmp_list) 16minus_counter = -min(tmp_list) 17print(plus_counter) 18print(minus_counter) 19
投稿2018/04/07 09:39
編集2018/04/07 09:48総合スコア1167
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/04/07 09:44
2018/04/08 04:23
0
似たような回答です。
このような
正の数 → a
負の数 → b
変換を元のリストに対して行い、それを空白なしで連結して文字列に整形します。
[0.1,0.5,0.03,-0.19,-0.05,0.1,0.5,-0.2]
↓
aaabbaab
この整形した文字列に対して、正規表現モジュールreのパターンマッチング(a+|b+)で連続した文字列を全て取り出します。
これをsortすることで連続したaの文字列のグループ、連続したbの文字列のグループに分割することができます(実際には1つのリスト)。
後は、リストのラストが負の数の最大連続数、それを除いた残りのリストの最大値が正の数の最大連続数になります。
python
1import re 2 3src = [0.1,0.5,0.03,-0.19,-0.05,0.1,0.5,-0.2] 4 5src_t = ''.join(map(lambda x: 'ab'[x < 0], src)) 6groups = re.findall('a+|b+', src_t) 7 8def seq_len_max(groups, s): 9 return len(max(filter(lambda x: s in x, groups), key=len)) 10 11seq_plus = seq_len_max(groups, 'a') 12seq_minus = seq_len_max(groups, 'b') 13 14print(seq_plus, seq_minus)
投稿2018/04/07 11:30
編集2018/04/08 02:14総合スコア158
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/04/08 04:18
2018/04/08 04:26
0
array型がPythonのbuilt-inのarrayなのか、numpyのarrayなのかどっちでしょう。numpy.arrayを使ったほうがごちゃごちゃしたlambda式に頼らなくていいので読みやすなるような。
Python
1import numpy as np 2src = [0.1,0.5,0.03,-0.19,-0.05,0.1,0.5,-0.2] 3src = np.array(src) 4is_positive = (src > 0) 5# array([ True, True, True, False, False, True, True, False])
あとは他の方の回答にある通り、groupbyを使うのがいいかなと思います。
python
1from itertools import groupby 2max_len = 0 3for _is_positive, items in groupby(is_positive): 4 if _is_positive: 5 n = len(list(items)) 6 pos_max = n if n > pos_max else pos_max
投稿2018/04/08 06:37
総合スコア3601
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。