49251

[code]

    例
    input 数列　{1, 2, 2.01, 3}　と　許容誤差(範囲)=0.1
    output　  　{1} {2, 2.01} {3}
    
[/code]

①タイトルで意味が通じますか？正式名称があれば教えて下さい。検索語が思いつきませんでした。  
②outputを、区切り1.5と2.5(2.8でも可)にする予定です。  
③特に言語にこだわりません。おすすめのページがあれば教えて下さい。  
よろしくお願いします。

2018ー10ー10ーーー  
仕様が不十分でした。  
「以上」、「四捨五入」は、想定していません。  
区切りの意味について、  
最初の区切りは、グループ1の最後の値とグループ2の最初の値の平均=(1+2)/2=1.5  
次 の区切りは、グループ2の最後の値とグループ3の最初の値の平均=(2.01+3)/2=2.505  
以下同文

[code]

    import numpy as np
    maxgap=0.1
    a = np.array([1, 2, 2.01, 3])
    d = a[1:] - a[:-1]
    i = np.where(d > maxgap)[0]
    output = (a[i] + a[i+1])/2
    print(a)
    print(output)
    # [1.   2.   2.01 3.  ]
    # [1.5   2.505]-----------できました。
    
[/code]

例2  
数列の差で0.1がある時、次のようになると思います。  
input 数列{1.0, 1.05, 1.2, 1.3, 2.0, 3.0}と許容誤差(範囲)=0.1  
output {1.0,1.05} {1.2} {1.3} {2.0} {3.0}  
区切り 1.125,1.25,1.65,2.5

[code]

    import numpy as np
    maxgap=0.1
    a = np.array({1.0, 1.05, 1.2, 1.3, 2.0, 3.0})
    d = a[1:] - a[:-1]
    i = np.where(d > maxgap)[0]
    output = (a[i] + a[i+1])/2
    print(a)
    print(output)
    # File "C:/Users/xxx/.PyCharmCE2018.2/config/scratches/scratch_29.py", line 27, in <module>
    # d = a[1:] - a[:-1]
    # IndexError: too many indices for array
    
[/code]

すみません。ループの使い方を教えて下さい。  
よろしくお願いします。

cluster analysisやyieldやCausal Clusteringについては、これから勉強したいと思います。

2018-10-12----------------------------------------------------------------  
「許容誤差(範囲)」という表現が間違っていました。「次の値との差」の意味でした。  
仕様  
「小さい順の数列で、次の値との差が、0.1以上の時に区切る。  
区切る値は、次の値との平均とする。」  
同じ仕様?  
「小さい順の数列で、次の値との平均値との差が、0.05（＝0.1/2)以上の時に区切る。」  
その平均値を区切る値とする。」

> この場合のグループ分けはどうするのでしょうか。  
>  input 数列{1, 1.06, 1.12}と「次の値との離れ」=0.1  
>  output {1, 1.06, 1.12}  
>  グループ分けなし(分割なし)  
>  1.06-1 =0.06 < 0.1 区切らない  
>  1.12-1.06=0.06 < 0.1 区切らない  
>  確かに、連続したらグループ分けなし(分割なし)があります。

大きな離れと小さな離れで、グループ分けを想像していました。  
等間隔を想定していませんでした。その時は、0.1を小さくします。  
「maxgap?」ピンときませんね。


CC BY-SA 4.0
2018-10-08T16:59:39.900
49062
2018-10-13T12:56:55.890
2018-10-12T14:06:44.407
17199
17199
question
python アルゴリズム
数列を許容範囲でグループ化(分割)する方法を教えて下さい。


今回の質問であれば、以下のコードで答えは出力でます。他の方法でもできると思います。

[code]

    import numpy as np
    
    a = np.array([1, 2, 2.01, 3])
    d = a[1:] - a[:-1]
    i = np.where(d > 0.1)[0] + 1
    output = np.split(a, i)
    
[/code]

> ② outputを、区切り1.5と2.5(2.8でも可)にする予定です。

以下のコードで出力できます。

[code]

    import numpy as np
    
    a = np.array([1, 2, 2.01, 3])
    d = a[1:] - a[:-1]
    i = np.where(d > 0.1)[0]
    output = (a[i] + a[i+1])/2
    
[/code]


CC BY-SA 4.0
2018-10-09T22:41:17.087
49116
2018-10-09T22:41:17.087
15171
49062
answer


>
[code]

>     a = np.array({1.0, 1.05, 1.2, 1.3, 2.0, 3.0})
>  
[/code]

`{1.0, 1.05, ...}`
のようにして作られるのは[集合](https://docs.python.jp/3/library/stdtypes.html#set-types-set-
frozenset)です。これには順序が無いですし、`np.array`
に渡した際もおそらく質問者さんの期待通りにはなっていないはずです。`IndexError`
もこれが原因でしょう。この場合リストでよいと思いますが、集合を使いたい場合は[`sorted`](https://docs.python.jp/3/library/functions.html#sorted)
で昇順のリストにするなどして下さい。

> ループの使い方を教えて下さい。

NumPy などを使わずに、ということであれば特にスマートな方法は思い付きません。

[code]

    #!/usr/bin/python3
    
    def split(sep_gap, nums):
        groups = []
        sep_vals = []
    
        for n in nums:
            if not groups:
                groups.append([n])
                continue
            last = groups[-1][-1]
            gap = n - last
            if gap >= sep_gap:
                groups.append([n])
                sep_vals.append((n + last) / 2)
            else:
                groups[-1].append(n)
    
        return {'groups': groups, 'sep_vals': sep_vals}
    
    
    if __name__ == "__main__":
        s = split(0.1, [1.0, 1.05, 1.2, 1.3, 2.0, 3.0])
        print('グループ:', s['groups'])
        print('区切り:', s['sep_vals'])
    
[/code]

出力:

[code]

    グループ: [[1.0, 1.05], [1.2], [1.3], [2.0], [3.0]]
    区切り: [1.125, 1.25, 1.65, 2.5]
    
[/code]


CC BY-SA 4.0
2018-10-13T12:56:55.890
49251
2018-10-13T12:56:55.890
3054
49062
answer