Python: преобразование таблицы астропии в массив (с использованием Numpy?) Для построения графиков (на matplotlib) - PullRequest
1 голос
/ 07 апреля 2020

У меня есть таблица Astropy как таковая:

         a           b    c 
------------------- ---- ---
-0.6096212422044334  2.0 3.0
-1.2192424844088667 10.0 3.0
   -5.4865911798399  9.0 3.0

Я хочу превратить эту таблицу обратно в массив для построения графиков. Это то, что я пытался:

d=Table(t)
x=np.array(d)
print(x)

Это то, что я получаю (я считаю, это кортеж):

[(-0.60962124,  2., 3.) (-1.21924248, 10., 3.) (-5.48659118,  9., 3.)]

Когда я спрашиваю 'np.shape (x) «Я получаю (3), поэтому я считаю, что это кортеж. Мне нужна форма (3,3), чтобы я мог вызывать отдельные элементы и выводить эту информацию на график.

Спасибо, Q

1 Ответ

2 голосов
/ 08 апреля 2020

Это структурированный массив numpy , в котором «элементами» массива являются не одиночные значения с плавающей точкой, а триплеты (в данном случае) с плавающей точкой. Это происходит отчасти потому, что в общем случае, когда все столбцы имеют разный тип данных, исходный формат данных все еще сохраняется (3 столбца и 3 (возможно) разнородных строки). Вот почему форма имеет вид (3,).

. В этом случае вы можете безопасно преобразовать в однородный массив (3, 3), поскольку все столбцы имеют тип данных с плавающей запятой. Есть несколько способов сделать это, но одним из самых простых и безопасных является утилита structured_to_unstructured.

Обновление: Теперь, когда я за компьютером, вот конкретный пример, основанный на вашем:

>>> f = io.BytesIO(b"""\ 
...          a           b    c  
... ------------------- ---- --- 
... -0.6096212422044334  2.0 3.0 
... -1.2192424844088667 10.0 3.0 
...    -5.4865911798399  9.0 3.0 
... """)                                                                                       
>>> t = Table.read(f, format='ascii.fixed_width_two_line')                                     
>>> t                                                                                          
<Table length=3>
         a             b       c   
      float64       float64 float64
------------------- ------- -------
-0.6096212422044334     2.0     3.0
-1.2192424844088667    10.0     3.0
   -5.4865911798399     9.0     3.0
>>> t.as_array()                                                                               
array([(-0.60962124,  2., 3.), (-1.21924248, 10., 3.),
       (-5.48659118,  9., 3.)],
      dtype=[('a', '<f8'), ('b', '<f8'), ('c', '<f8')])
>>> a = np.lib.recfunctions.structured_to_unstructured(t.as_array())                           
>>> a                                                                                          
array([[-0.60962124,  2.        ,  3.        ],
       [-1.21924248, 10.        ,  3.        ],
       [-5.48659118,  9.        ,  3.        ]])
>>> a.shape                                                                                    
(3, 3)
...