Konwertuj std :: vector na tablicę NumPy bez kopiowania danych

Mam bibliotekę C ++, która ma obecnie kilka metod, które zwracają astd::vector zdefiniowany jak

public:
  const std::vector<uint32_t>& getValues() const;

Obecnie pracuję nad opakowaniem całej biblioteki dla Pythona za pomocą SWIG i działa to do tej pory.

SWIG zawija togetValues() działa dobrze, tak że zwraca krotkę Pythona. Problem polega na tym, że w moim kodzie po stronie Pythona chcę go przekonwertować na tablicę NumPy. Oczywiście mogę to zrobić przez:

my_array = np.array(my_object.getValues(), dtype='uint32')

powoduje to jednak, że wszystkie wpisy w oryginalnym wektorze zostaną najpierw skopiowane do krotki Pythona przez SWIG, a następnie ponownie przeze mnie do tablicy numpy. Ponieważ ten wektor może być bardzo duży, wolałbym uniknąć tworzenia tych dwóch kopii i chciałbym, aby SWIG utworzył opakowanie numpy.array wokół oryginalnych danych wektorowych w pamięci.

Przeczytałem dokumentacjęnumpy.i ale wyraźnie wspomina, że ​​tablice wyjściowe nie są obsługiwane, ponieważ wydają się działać przy założeniu tablic w stylu C, a nie wektorów C ++.

Podstawowa struktura danych numpy.array to tylko tablica w stylu C, podobnie jak std :: vector C ++, więc mam nadzieję, że możliwe będzie uzyskanie dostępu do tych samych danych w pamięci.

Czy jest jakiś sposób, aby SWIG zwrócił numpy.array, który nie kopiuje oryginalnych danych?

questionAnswers(2)

yourAnswerToTheQuestion