HDF5 как обрабатывать пустые строки

Я хочу передать некоторые значения, заданные датчиком MOCAP, в файл hdf5. Итак, чтобы упростить вещи, допустим, у меня есть таблица, подобная следующей:

| time |  x1 |  y1 |  x2 |  y2 |
|    0 | 2.0 | 1.0 | 2.0 | 3.0 |
|    1 | 2.1 | 1.0 | 2.3 | 3.1 |
|    2 | 2.4 | 1.4 |     |     |
|    3 | 2.2 | 1.5 | 2.4 | 3.1 |
|    4 |     |     | 2.3 | 3.2 |

У меня есть несколько пустых мест, потому что мой датчик не может прочитать информацию определенного тела в определенное время. Итак, мой вопрос, как я могу обработать в одном наборе данных эту пустую информацию?

Используя формат CSV, я могу просто игнорировать информацию, просто не записывая значения между 2 запятыми. я использую h5py с питоном. Как примечание, у меня есть положительные и отрицательные числа.

На самом деле вопрос был бы, если есть лучший или более правильный способ, чем положить NaN в поле.

1 ответ

Решение

Я думаю, что вы абсолютно правы в использовании NaN,

Я бы установить значение заполнения и использовать его, при этом я бы использовал NaN или же None,

#!/usr/bin/env python

import numpy as np
import h5py as h5

f = h5.File('test.h5','w')

ctype = np.dtype([('time','i'),
                  ('x1','f8'),('y1','f8'),
                  ('x2','f8'),('y2','f8')])

d = f.create_dataset('test', (5,), dtype=ctype)
d.set_fill_value = np.nan

data = np.array([(0, 2.0,    1.0,    2.0,    3.0),
                 (1, 2.1,    1.0,    2.3,    3.1),
                 (2, 2.4,    1.4,    np.nan, np.nan),
                 (3, 2.2,    1.5,    2.4,    3.1),
                 (4, np.nan, np.nan, 2.3,    3.2)],
                 dtype = ctype)
d[...] = data
f.close()

Тогда, если мы запустим его и посмотрим на файл, который он производит.

localhost ~$ ./test.py
localhost ~$ h5dump test.h5
 h5dump test.h5 
HDF5 "test.h5" {
GROUP "/" {
   DATASET "test" {
      DATATYPE  H5T_COMPOUND {
         H5T_STD_I32LE "time";
         H5T_IEEE_F64LE "x1";
         H5T_IEEE_F64LE "y1";
         H5T_IEEE_F64LE "x2";
         H5T_IEEE_F64LE "y2";
      }
      DATASPACE  SIMPLE { ( 5 ) / ( 5 ) }
      DATA {
      (0): {
            0,
            2,
            1,
            2,
            3
         },
      (1): {
            1,
            2.1,
            1,
            2.3,
            3.1
         },
      (2): {
            2,
            2.4,
            1.4,
            nan,
            nan
         },
      (3): {
            3,
            2.2,
            1.5,
            2.4,
            3.1
         },
      (4): {
            4,
            nan,
            nan,
            2.3,
            3.2
         }
      }
   }
}
}

Конечно, вам не нужно использовать составной тип данных, я просто сделал это, поскольку это имеет смысл в вашем контексте.

Другие вопросы по тегам