python преобразует неформальный файл комплексных чисел в формальные данные амплитуды

У меня есть txt-файл, состоящий из 90 групп данных носителя, которые разделены новой строкой. Каждый носитель данных состоит из 200 комплексных чисел, разделенных табуляцией.
то, что я хочу, это просто массив 90*200, каждый из которых является амплитудой комплексного числа.Как прочитать файл и конвертировать?

2 ответа

  1. read_csvПараметр with можно использовать skip_blank_linesдля получения групп:

    import pandas as pd
    import numpy as np
    from pandas.compat import StringIO
    
    temp=u"""
    7+3j;2+1j
    1+6j;5+1j
    
    8+3j;1+7j
    5+4j;4+1j
    
    6+2j;2+1j
    8+4j;9+3j
    """
    #after testing replace StringIO(temp) to filename
    df = pd.read_csv(StringIO(temp), 
                     sep=";", #in real data use sep='\t'
                     skip_blank_lines=False, 
                     names=np.arange(2)) #in real data use 200
    print (df)
          0     1
    0   NaN   NaN
    1  7+3j  2+1j
    2  1+6j  5+1j
    3   NaN   NaN
    4  8+3j  1+7j
    5  5+4j  4+1j
    6   NaN   NaN
    7  6+2j  2+1j
    8  8+4j  9+3j
    

    Создать индекс, выбрав первый столбец byiloc, получить маску byisnull, а затем применитьcumsum-создать группы с одинаковыми значениями в index:

    df.index = df.iloc[:, 0].isnull().cumsum()
    

    Затем удалите все строки, где NaNв первом столбце по dropna:

    df = df.dropna(subset=[0])
    

    Преобразовать в комплекс и получить амплитуду по numpy.angle:

    df = df.applymap(lambda x: np.angle(np.complex(x)))
    print (df)
              0         1
    0                    
    1  0.404892  0.463648
    1  1.405648  0.197396
    2  0.358771  1.428899
    2  0.674741  0.244979
    3  0.321751  0.463648
    3  0.463648  0.321751
    

    Последний groupbyпо индексу и преобразовать в массив numpy по values:

    print (df.groupby(level=0).apply(lambda x: x.values).values)
    [array([[ 0.40489179,  0.46364761],
           [ 1.40564765,  0.19739556]])
     array([[ 0.35877067,  1.42889927],
           [ 0.67474094,  0.24497866]])
     array([[ 0.32175055,  0.46364761],
           [ 0.46364761,  0.32175055]])]
    

    Если не нужно использовать группы:

    import pandas as pd
    import numpy as np
    from pandas.compat import StringIO
    
    temp=u"""
    7+3j;2+1j
    1+6j;5+1j
    
    8+3j;1+7j
    5+4j;4+1j
    
    6+2j;2+1j
    8+4j;9+3j
    """
    #after testing replace StringIO(temp) to filename
    df = pd.read_csv(StringIO(temp), 
                     sep=";", #in real data use sep='\t'
                     names=np.arange(2)) #in real data use 200
    print (df)
          0     1
    0  7+3j  2+1j
    1  1+6j  5+1j
    2  8+3j  1+7j
    3  5+4j  4+1j
    4  6+2j  2+1j
    5  8+4j  9+3j
    
    df = df.applymap(lambda x: np.angle(np.complex(x)))
    print (df)
    
              0         1
    0  0.404892  0.463648
    1  1.405648  0.197396
    2  0.358771  1.428899
    3  0.674741  0.244979
    4  0.321751  0.463648
    5  0.463648  0.321751
    
    print (df.values)
    [[ 0.40489179  0.46364761]
     [ 1.40564765  0.19739556]
     [ 0.35877067  1.42889927]
     [ 0.67474094  0.24497866]
     [ 0.32175055  0.46364761]
     [ 0.46364761  0.32175055]]