es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Especificación de la forma del conjunto de datos al crear un archivo HDF5

Tengo una función con la siguiente firma:

fn create_something(...) -> ndarray::ArrayBase<><f64>, ndarray::Dim<[usize; 2]>> {
// Hace cosas
}

Luego llamo a esta función y me gustaría guardar los datos en un archivo HDF5:

let data = create_something(...);

let file = hdf5::File::create("./output/example.h5"); // abrir para escritura
let group = file.create_group("example_group"); // crear un grupo
let data_set = group.new_dataset::<f64>().create("example");
let write_res = data_set.write(data.view());
match write_res {
    Ok(_) => (),
    Err(error) => panic!("Error: {:?}", error)
}

Resultado:

thread 'main' panicked at 'Error: shape mismatch when writing: memory = [1950, 24191], destination = []', src/main.rs:203:27
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

Entonces parece haber un problema con la forma, lo cual es razonable ya que no he especificado realmente la forma del conjunto de datos… Lo que no entiendo es cómo puedo especificar esto (encuentro la documentación aquí muy confusa…) y cómo se podría añadir datos al conjunto de datos si necesitamos conocer su forma exacta al crearlo…

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para especificar la forma del conjunto de datos, debemos pasar las dimensiones esperadas como argumento al crear el conjunto de datos. En este caso, como tenemos una matriz 2D, necesitamos especificar el número de filas y columnas.

    Por ejemplo:

    let data_set = group.new_dataset::<f64>()
                    .create("example", (data.shape()[0], data.shape()[1]));
    

    Donde data.shape() devuelve las dimensiones del arreglo de datos.

    Para agregar datos a un conjunto de datos existente, el conjunto de datos debe ser extensible. Podemos crear un conjunto de datos extensible pasando un objeto hdf5::dataspace::Properties durante la creación y configurando el argumento max_dimensions a Some(dimensions).

    Por ejemplo:

    let mut data_set = group.new_dataset::<f64>()
                        .create("example", (100, 100))
                        .with_max_dimensions(Some((hdf5::h5s::H5S_UNLIMITED, hdf5::h5s::H5S_UNLIMITED)))
                        .unwrap();
    

    Luego, podemos agregar datos usando el método append:

    data_set.append(data.view()).unwrap();
    

    Tenga en cuenta que el método append espera datos con el mismo número de dimensiones que el conjunto de datos, y los nuevos datos deben ajustarse a las max_dimensions especificadas en la creación.

Comments are closed.