Ho un ++ biblioteca che attualmente ha alcuni metodi C all'interno del quale restituire un std::vector
definito comeConvertire uno std :: vector a un array NumPy senza copiare i dati
public:
const std::vector<uint32_t>& getValues() const;
Attualmente sto lavorando su avvolgendo l'intera libreria per Python usando SWIG e questo sta funzionando bene finora.
SWIG avvolge questa funzione getValues()
in modo che restituisca una tupla Python. Il problema è nel mio codice lato Python che voglio convertire questo in un array NumPy. Certo che posso fare questo:
my_array = np.array(my_object.getValues(), dtype='uint32')
ma questo fa sì che tutte le voci del vettore originale da prima copiati in una tupla Python SWIG e poi di nuovo in un array di NumPy da me. Dato che questo vettore potrebbe essere molto grande, preferirei evitare di fare queste due copie e vorrei avere un modo per far sì che SWIG crei un wrapper numpy.array attorno ai dati vettoriali originali in memoria.
Ho letto la documentazione per numpy.i ma ciò indica esplicitamente che gli array di output non sono supportati poiché sembrano funzionare sotto l'ipotesi di array in stile C piuttosto che di vettori C++.
La struttura di dati sottostante di numpy.array è solo una matrice in stile C come lo è un C++ std :: vector, quindi mi auguro che sia possibile accedere agli stessi dati in memoria.
C'è un modo per rendere SWIG restituire un numpy.array che non copia i dati originali?
Ciò ha causato l'arresto anomalo di python. – snowleopard