Tôi có một thư viện C++ mà hiện nay có một số phương pháp trong đó trả về một std::vector
định nghĩa như thếChuyển đổi một std :: vector để một mảng NumPy mà không cần sao chép dữ liệu
public:
const std::vector<uint32_t>& getValues() const;
Tôi hiện đang làm việc trên gói toàn bộ thư viện cho Python sử dụng SWIG và điều này đang hoạt động tốt cho đến nay.
SWIG kết thúc tốt đẹp chức năng này getValues()
sao cho nó trả về bộ túp Python. Vấn đề là trong mã phía Python của tôi, tôi muốn chuyển đổi này thành một mảng NumPy. Tất nhiên tôi có thể làm điều này bằng cách:
my_array = np.array(my_object.getValues(), dtype='uint32')
nhưng điều này làm cho tất cả các mục trong vector ban đầu được sao chép lần đầu vào một tuple Python bởi SWIG và sau đó lại trở thành mảng cứng nhắc của tôi. Vì vectơ này có thể rất lớn, tôi muốn tránh tạo hai bản sao này và muốn có một cách để SWIG tạo ra một bao bọc numpy.array xung quanh dữ liệu vectơ ban đầu trong bộ nhớ.
Tôi đã đọc tài liệu cho numpy.i nhưng rõ ràng đề cập rằng mảng đầu ra không được hỗ trợ vì chúng dường như hoạt động dưới giả định của mảng kiểu C chứ không phải vectơ C++.
Cấu trúc dữ liệu cơ bản của numpy.array chỉ là một mảng kiểu C như là một C++ std :: vectơ vì vậy tôi hy vọng có thể truy cập vào cùng một dữ liệu trong bộ nhớ.
Có cách nào để làm cho SWIG trả lại giá trị numpy.array không sao chép dữ liệu gốc không?
Điều này khiến cho con trăn đổ vỡ cho tôi. – snowleopard