Sprawdziłem różne rozwiązania, ale nie mogłem zrozumieć, jak zastosować je do tablic wielowymiarowych. Mówiąc dokładniej, mój kod daje w wyniku większą tablicę niż powinna, jak pokazano na poniższym obrazku:

import h5py
import pandas as pd
import numpy as np

data = [[1583663558450195, -7.063664436340332, -6.2776079177856445, -4.206898212432861, -4.206898212432861], [1583663558450195, -7.063664436340332, -6.2776079177856445, -4.206898212432861, -4.206898212432861], [1583663558450195, -7.063664436340332, -6.2776079177856445, -4.206898212432861, -4.206898212432861], [1583663558450195, -7.063664436340332, -6.2776079177856445, -4.206898212432861, -4.206898212432861], [1583663558450195, -7.063664436340332, -6.2776079177856445, -4.206898212432861, -4.206898212432861], [1583663558450195, -7.063664436340332, -6.2776079177856445, -4.206898212432861, -4.206898212432861], [1583663558450195, -7.063664436340332, -6.2776079177856445, -4.206898212432861, -4.206898212432861], [1583663558450195, -7.063664436340332, -6.2776079177856445, -4.206898212432861, -4.206898212432861], [1583663558450195, -7.063664436340332, -6.2776079177856445, -4.206898212432861, -4.206898212432861], [1583663558450195, -7.063664436340332, -6.2776079177856445, -4.206898212432861, -4.206898212432861]]

df = pd.DataFrame(data)

hf = h5py.File('dtype.h5', 'w')

dataTypes = np.dtype([('ts', 'u8'), ('x', 'f4'), ('y', 'f4'), ('z', 'f4'), ('temp', 'f4')])
ds = hf.create_dataset('Acceleration', data=df.astype(dataTypes))

enter image description here

Chciałbym zrobić to tak, gdzie kolumny mają odpowiednio uint64, 4x float32:

                 ts         x         y         z      temp
0  1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
1  1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
2  1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
3  1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
4  1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
5  1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
6  1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
7  1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
8  1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
9  1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
0
stardust 8 marzec 2020, 16:36

2 odpowiedzi

Najlepsza odpowiedź

Twoje df:

In [370]: df                                                                                   
Out[370]: 
                  0         1         2         3         4
0  1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
1  1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
2  1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
3  1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
...

df.astype(dataTypes) daje mi TypeError (mój pd nie jest najnowszy).

In [373]: df.to_records()                                                                      
Out[373]: 
rec.array([(0, 1583663558450195, -7.06366444, -6.27760792, -4.20689821, -4.20689821),
           (1, 1583663558450195, -7.06366444, -6.27760792, -4.20689821, -4.20689821),
           (2, 1583663558450195, -7.06366444, -6.27760792, -4.20689821, -4.20689821),
           (3, 1583663558450195, -7.06366444, -6.27760792, -4.20689821, -4.20689821),
           (4, 1583663558450195, -7.06366444, -6.27760792, -4.20689821, -4.20689821),
           (5, 1583663558450195, -7.06366444, -6.27760792, -4.20689821, -4.20689821),
           (6, 1583663558450195, -7.06366444, -6.27760792, -4.20689821, -4.20689821),
           (7, 1583663558450195, -7.06366444, -6.27760792, -4.20689821, -4.20689821),
           (8, 1583663558450195, -7.06366444, -6.27760792, -4.20689821, -4.20689821),
           (9, 1583663558450195, -7.06366444, -6.27760792, -4.20689821, -4.20689821)],
          dtype=[('index', '<i8'), ('0', '<i8'), ('1', '<f8'), ('2', '<f8'), ('3', '<f8'), ('4', '<f8')])

Ta tablica powinna zostać zapisana z h5py.

to_records ma parametry, które mogą stworzyć coś bliższego Twojemu dataTypes. Pozwolę ci je zbadać.

Ale dzięki najnowszej restrukturyzacji recfunctions możemy utworzyć tablicę strukturalną z:

In [385]: import numpy.lib.recfunctions as rf                                                  
In [386]: rf.unstructured_to_structured(np.array(data), dataTypes)                             
Out[386]: 
array([(1583663558450195, -7.0636644, -6.277608, -4.206898, -4.206898),
       (1583663558450195, -7.0636644, -6.277608, -4.206898, -4.206898),
       (1583663558450195, -7.0636644, -6.277608, -4.206898, -4.206898),
       (1583663558450195, -7.0636644, -6.277608, -4.206898, -4.206898),
       (1583663558450195, -7.0636644, -6.277608, -4.206898, -4.206898),
       (1583663558450195, -7.0636644, -6.277608, -4.206898, -4.206898),
       (1583663558450195, -7.0636644, -6.277608, -4.206898, -4.206898),
       (1583663558450195, -7.0636644, -6.277608, -4.206898, -4.206898),
       (1583663558450195, -7.0636644, -6.277608, -4.206898, -4.206898),
       (1583663558450195, -7.0636644, -6.277608, -4.206898, -4.206898)],
      dtype=[('ts', '<u8'), ('x', '<f4'), ('y', '<f4'), ('z', '<f4'), ('temp', '<f4')])

np.array(data) to (10,5) tablica zmiennoprzecinkowa.

In [388]: pd.DataFrame(_386)                                                                   
Out[388]: 
                 ts         x         y         z      temp
0  1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
1  1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
2  1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
 ...
1
hpaulj 8 marzec 2020, 17:03

To pytanie jest trudniejsze, niż się początkowo wydaje. Na początku pomyślałem, że mogę zastosować tę samą metodę, co moja odpowiedź na Twoje poprzednie pytanie SO 60562311: zdefiniuj indywidualne typy danych dla każdej kolumny. Ma jednak kilka subtelnych różnic:

  1. Te dane to Lista List VS macierz 5x5 NumPy
  2. Te dane są typu mieszanego (Ints i Floats) VS wszystkie Floats
  3. Te dane mają bardziej znaczące liczby niż w poprzednim przykładzie

Jak to zmienia procedurę?

  • Listę List można przekonwertować na tablicę NumPy za pomocą np.array(data) Jednak to nie rozwiązuje całkowicie problemu. Nadal będziesz otrzymywać zduplikowane kolumny.
  • Musisz także zmienić typ obiektu w deklaracji dtype. f4 musi być f8, a u8 musi być uint16

Wprowadź te zmiany, a wszystko będzie działać tak, jak moja poprzednia odpowiedź. Zobacz aktualizację oryginalnego kodu poniżej.

dataTypes = np.dtype([('ts', 'uint16'), ('x', 'f8'), 
            ('y', 'f8'), ('z', 'f8'), ('temp', 'f8')])
# create array from list of lists
d_arr = np.array(data) 
# create record array
rec_arr = np.rec.array(d_arr, dtype=dataTypes)
with h5py.File('dtype.h5', 'w') as hf:
    ds = hf.create_dataset('Acceleration', data=rec_arr)
1
kcw78 9 marzec 2020, 20:47