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.

empuje y transferencia de datos automática

Tengo una función en una biblioteca que necesita trabajar con datos provenientes de Python.

Primero, creo una tupla llamada vec3.

typedef thrust::tuple<double,double,double> vec3;
void thrust_decimation( double* x, double* y, double* z, long number_of_vertex)
{
    auto data2workwith = thrust::make_tuple(x, y, z);

    std::vector<vec3> local(number_of_vertex);

    for (int64_t i = 0; i < number_of_vertex; i++)
    {
        local[i] = vec3(x[i], y[i], z[i]);
    }

    thrust::device_vector<vec3> keys1 = local;
    thrust::device_vector<vec3> keys2(number_of_vertex);

    thrust::sort(keys1.begin(), keys1.end());

    thrust::transform(keys1.begin(), keys1.end(), keys2.begin(), gridTransform(gridscale));

    ... trabajar con local
    ... trabajar en x, y, z
    ... retornar x, y, z
}

No sé cómo transferir data2workwith. Hice un bucle, pero como tengo una gran cantidad de datos, la duración es demasiado larga ya que tengo que hacerlo dos veces.</double,double,double>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para transferir datos de Python a la función de C++, puedes utilizar la API de Python C para crear una tupla en Python y pasarla como argumento a tu función de C++. Aquí tienes un ejemplo:

    import ctypes
    import numpy as np
    
    # Carga la biblioteca de C++ que contiene la función
    lib = ctypes.cdll.LoadLibrary('mylib.so')
    
    # Crea algunos datos de entrada en Python
    x = np.arange(1000, dtype=np.double)
    y = np.sin(x)
    z = np.cos(x)
    number_of_vertex = len(x)
    
    # Crea una tupla en Python que contenga los datos de entrada
    data_tuple = (x.ctypes.data, y.ctypes.data, z.ctypes.data)
    
    # Llama a la función de C++ con la tupla
    lib.thrust_decimation(*data_tuple, number_of_vertex)
    
    # La función modifica los arreglos de entrada directamente, por lo que puedes
    # acceder a los datos modificados en Python con los mismos arreglos numpy:
    print(x, y, z)
    

    Dentro de la función de C++, puedes crear una thrust::tuple a partir de los arreglos de entrada utilizando thrust::make_tuple. Aquí tienes la función modificada:

    “`c++
    void thrust_decimation(double* x, double* y, double* z, long number_of_vertex)
    {
    // Crea una tuple a partir de los arreglos de entrada
    auto data2workwith = thrust::make_tuple(x, y, z);

    // El resto de la función se mantiene igual
    std::vector<vec3> local(number_of_vertex);
    
    for (int64_t i = 0; i < number_of_vertex; i++)
    {
        local[i] = vec3(x[i], y[i], z[i]);
    }
    
    thrust::device_vector<vec3> keys1 = local;
    thrust::device_vector<vec3> keys2(number_of_vertex);
    
    thrust::sort(keys1.begin(), keys1.end());
    
    thrust::transform(keys1.begin(), keys1.end(), keys2.begin(), gridTransform(gridscale));
    
    // ...trabajar con local
    // ...trabajar en x, y, z
    

    }
    “`

    Ten en cuenta que los arreglos de entrada se modifican directamente, por lo que puedes acceder a los datos modificados en Python con los mismos arreglos numpy que pasaste como entrada.

Comments are closed.