Я пытаюсь преобразовать мой 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.