46903


データの抽出方法について質問です。  
以下のようになっているデータから、10,20の次に現れる数字を連続しているまとまりごとに抜き出したいのですが、なにかいい方法はないででしょうか。

[code]

    …
    0
    LWPOLYLINE
    5
    1522
    330
    1F
    100
    AcDbEntity
    8
    画層名
    100
    AcDbPolyline
    90
    22
    70
    1
    43
    0.0
    38
    290.08
    10
    122047533.05079
    20
    5726174.709811977
    10
    122042929.05079
    20
    5728126.709811976
    10
    122040976.4653259
    20
    5728970.372402169
    10
    122025572.931653
    20
    5715437.268879825
    10
    122028600.8501561
    20
    5711990.857305059
    10
    122032549.7739609
     20
    5709784.518035731
    10
    122035907.0023307
    20
    5707274.252141885
    0
    LWPOLYLINE
    …
    
[/code]

自分が作ったコードでは、偶数行と奇数行で分けて10,20が終わると0が来るためそれで区切って作ってみてます

[code]

    import numpy as np
    
    with open("../a.dxf", "r", encoding='utf-8') as open_file:
        lines = [line.strip() for line in open_file.readlines()]
    odd = np.array(lines[0::2], dtype=np.int64)
    even = np.array(lines[1::2])
    check_box = np.array(max(np.where(odd == 0)))
    j = 0
    box1 = []
    box2 = []
    points1 = []
    points2 = []
    for i in range(max(check_box)):
        if (check_box[j] <= i < check_box[j + 1]) and odd[i] == 10:
            box1.append(float(even[i]))
        elif (check_box[j] <= i < check_box[j + 1]) and odd[i] == 20:
            box2.append(float(even[i]))
        elif i == check_box[j + 1]:
            points1.append([box1])
            points2.append([box2])
            box1 = []
            box2 = []
            j += 1
    
[/code]

pythonならfor文を使わないでリスト内包表記で書いたり、リストを使わないほうが早いと聞いていますが自分の力では出来ず上のようになっています。


CC BY-SA 4.0
2018-07-24T03:04:13.170
46888
2018-07-24T09:47:58.847
2018-07-24T05:06:51.447
29433
question
python python3
pythonでのデータの抽出方法


numpy は使わずに書いてみました。`'0'` が出現する位置で分割して、個別の領域ごとに集計しています。

[code]

    with open('a.dxf', 'r', encoding='utf-8') as f:
      lines = [l.strip() for l in f.readlines()]
    
    points1, points2 = [], []
    lst = [i for i, j in enumerate(lines) if j == '0']
    for i, j in zip(lst, lst[1:]):
      l = lines[i:j]
      points1.append([float(lines[i+k+1]) for k, v in enumerate(l) if v == '10'])
      points2.append([float(lines[i+k+1]) for k, v in enumerate(l) if v == '20'])
    
    print(points1)
    print(points2)
    
[/code]


CC BY-SA 4.0
2018-07-24T06:54:34.680
46899
2018-07-24T06:54:34.680
46888
answer


numpyを使って書いてみました。

[code]

    import numpy as np
    
    a = np.loadtxt('../a.dxf', dtype='object')
    p = np.where(a == '0')[0]
    r1 = np.where(a == '10')[0]
    # 分割する位置を計算
    sp = np.searchsorted(r1, p)
    # 10の次に現れる数字を取得して数値化
    r1 = a[r1 + 1].astype(np.float)
    # 一次元配列を分割
    points1 = np.split(r1, sp[1:])
    
    #こちらは短く書いてみました
    r2 = np.where(a == '20')[0]
    points2 = np.split(a[r2 + 1].astype(np.float), np.searchsorted(r2, p)[1:])
    
[/code]


CC BY-SA 4.0
2018-07-24T08:08:52.390
46903
2018-07-24T09:47:58.847
2018-07-24T09:47:58.847
15171
15171
46888
answer