Почему я продолжаю получать набор нан при кодировании?

Я пытаюсь преобразовать мой CSV-файл в массив Numpy, чтобы я мог манипулировать числами, а затем построить их график. Я распечатал свой CSV-файл и получил:

               ra              dec
0       15:09:11.8     -34:13:44.9
1       09:19:46.8   +33:44:58.452
2     05:15:43.488   +19:21:46.692
3     04:19:12.096    +55:52:43.32

.... есть больше кода (101 строка x 2 столбца), но это просто цифры. Я хотел преобразовать числа ra и dec из их текущей единицы в градусы, и я подумал, что смогу сделать это, превратив каждый столбец в пустой массив. Но когда я закодировал это:

import numpy as np
np_array = np.genfromtxt(r'C:Users
stevDownloadsS190930t.csv',delimiter=".", skip_header=1, usecols=(4))
print(np_array)

Я получил:

nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
nan nan nan nan nan nan nan nan nan nan]

Я продолжаю менять свой разделитель, и я изменил его на двоеточие и получил то же самое, точку с запятой и знак плюс, и я получил ошибку, говорящую, что он получил 2 столбца вместо 1. Я не знаю, как изменить его так, чтобы я не получить этот набор! Кто-нибудь, помогите, пожалуйста!

Всего 2 ответа


С помощью copy-n-paste образца вашего файла:

In [208]: data = np.genfromtxt('stack59761369.csv',encoding=None,dtype=None,names=True)          
In [209]: data                                                                                   
Out[209]: 
array([(ཋ:09:11.8', '-34:13:44.9'), (ཅ:19:46.8', '+33:44:58.452'),
       (ཁ:15:43.488', '+19:21:46.692'),
       (ཀ:19:12.096', '+55:52:43.32')],
      dtype=[('ra', '<U12'), ('dec', '<U13')])

с этим dtype и именами я получаю структурированный массив 1d с 2 полями.

In [210]: data['ra']                                                                             
Out[210]: 
array([ཋ:09:11.8', ཅ:19:46.8', ཁ:15:43.488', ཀ:19:12.096'],
      dtype='<U12')
In [211]: np.char.split(data['ra'],':')                                                          
Out[211]: 
array([list([ཋ', ཅ', ཇ.8']), list([ཅ', ཏ', ཪ.8']),
       list([ཁ', ཋ', ཧ.488']), list([ཀ', ཏ', ཈.096'])],
      dtype=object)

это разделение дает массив dtype объекта со списками. Они могут быть объединены в один 2d массив с помощью vstack :

In [212]: np.vstack(np.char.split(data['ra'],':'))                                               
Out[212]: 
array([[ཋ', ཅ', ཇ.8'],
       [ཅ', ཏ', ཪ.8'],
       [ཁ', ཋ', ཧ.488'],
       [ཀ', ཏ', ཈.096']], dtype='<U6')

и преобразован в поплавки с:

In [213]: np.vstack(np.char.split(data['ra'],':')).astype(float)                                 
Out[213]: 
array([[15.   ,  9.   , 11.8  ],
       [ 9.   , 19.   , 46.8  ],
       [ 5.   , 15.   , 43.488],
       [ 4.   , 19.   , 12.096]])
In [214]: np.vstack(np.char.split(data['dec'],':')).astype(float)                                
Out[214]: 
array([[-34.   ,  13.   ,  44.9  ],
       [ 33.   ,  44.   ,  58.452],
       [ 19.   ,  21.   ,  46.692],
       [ 55.   ,  52.   ,  43.32 ]])

панд

In [256]: df =  pd.read_csv('stack59761369.csv',delim_whitespace=True)                           
In [257]: df                                                                                     
Out[257]: 
             ra            dec
0    15:09:11.8    -34:13:44.9
1    09:19:46.8  +33:44:58.452
2  05:15:43.488  +19:21:46.692
3  04:19:12.096   +55:52:43.32
In [258]: df['ra'].str.split(':',expand=True).astype(float)                                      
Out[258]: 
      0     1       2
0  15.0   9.0  11.800
1   9.0  19.0  46.800
2   5.0  15.0  43.488
3   4.0  19.0  12.096
In [259]: df['dec'].str.split(':',expand=True).astype(float)                                     
Out[259]: 
      0     1       2
0 -34.0  13.0  44.900
1  33.0  44.0  58.452
2  19.0  21.0  46.692
3  55.0  52.0  43.320

прямое чтение строки

In [279]: lines = []                                                                             
In [280]: with open('stack59761369.csv') as f: 
     ...:     header=f.readline() 
     ...:     for row in f: 
     ...:         alist = row.split() 
     ...:         alist = [[float(i) for i in astr.split(':')] for astr in alist] 
     ...:         lines.append(alist) 
     ...:                                                                                        
In [281]: lines                                                                                  
Out[281]: 
[[[15.0, 9.0, 11.8], [-34.0, 13.0, 44.9]],
 [[9.0, 19.0, 46.8], [33.0, 44.0, 58.452]],
 [[5.0, 15.0, 43.488], [19.0, 21.0, 46.692]],
 [[4.0, 19.0, 12.096], [55.0, 52.0, 43.32]]]
In [282]: np.array(lines)                                                                        
Out[282]: 
array([[[ 15.   ,   9.   ,  11.8  ],
        [-34.   ,  13.   ,  44.9  ]],

       [[  9.   ,  19.   ,  46.8  ],
        [ 33.   ,  44.   ,  58.452]],

       [[  5.   ,  15.   ,  43.488],
        [ 19.   ,  21.   ,  46.692]],

       [[  4.   ,  19.   ,  12.096],
        [ 55.   ,  52.   ,  43.32 ]]])
In [283]: _.shape                                                                                
Out[283]: (4, 2, 3)

Первое измерение - это количество строк; второй столбец 2, третий столбец 3 значения

преобразование в степень

In [285]: _282@[1,1/60,1/360]                                                                    
Out[285]: 
array([[ 15.18277778, -33.65861111],
       [  9.44666667,  33.8957    ],
       [  5.3708    ,  19.4797    ],
       [  4.35026667,  55.987     ]])

К сожалению, значение -34 градуса неверно; все члены элемента должны иметь одинаковый знак.

коррекция

Определите элементы с отрицательной степенью:

In [296]: mask = np.sign(_282[:,:,0])                                                            
In [297]: mask                                                                                   
Out[297]: 
array([[ 1., -1.],
       [ 1.,  1.],
       [ 1.,  1.],
       [ 1.,  1.]])

скорректируйте все 3 условия соответственно:

In [298]: x = np.abs(_282)*mask[:,:,None]                                                        
In [299]: x                                                                                      
Out[299]: 
array([[[ 15.   ,   9.   ,  11.8  ],
        [-34.   , -13.   , -44.9  ]],

       [[  9.   ,  19.   ,  46.8  ],
        [ 33.   ,  44.   ,  58.452]],

       [[  5.   ,  15.   ,  43.488],
        [ 19.   ,  21.   ,  46.692]],

       [[  4.   ,  19.   ,  12.096],
        [ 55.   ,  52.   ,  43.32 ]]])
In [300]: x@[1, 1/60, 1/360]                                                                     
Out[300]: 
array([[ 15.18277778, -34.34138889],
       [  9.44666667,  33.8957    ],
       [  5.3708    ,  19.4797    ],
       [  4.35026667,  55.987     ]])

Возможно, NaN - это NaN (не число). Попробуйте установить тип данных Нет ( dtype=None ).

Кроме того, попробуйте опустить delimiter . По умолчанию любые последовательные пробелы действуют как разделитель.

Не уверен, что вы ожидаете, но, возможно, это будет лучшей отправной точкой ...

import numpy as np

np_array = np.genfromtxt(r"C:Users
stevDownloadsS190930t.csv", skip_header=1, dtype=None, encoding="utf-8", usecols=(1, 2))
print(np_array)

вывод на печать ...

[[ཋ:09:11.8' '-34:13:44.9']
 [ཅ:19:46.8' '+33:44:58.452']
 [ཁ:15:43.488' '+19:21:46.692']
 [ཀ:19:12.096' '+55:52:43.32']]

Отказ от ответственности: я не использую NumPy. Я основал свой ответ на https://docs.scipy.org/doc/numpy/reference/generated/numpy.genfromtxt.html.


Есть идеи?

10000