Вернуть ndarray в nanobind с собственной памятьюPython

Программы на Python
Ответить
Anonymous
 Вернуть ndarray в nanobind с собственной памятью

Сообщение Anonymous »

Интересно, есть ли у кого-нибудь представление о nanobind для возврата ndarray из C++ в Python.
Я просто хочу вернуть ndarray с заданным size, который я заполняю данными. Я не хочу управлять памятью с помощью С++. Поэтому я бы сделал что-то вроде:

Код: Выделить всё

...
.def("test", []() {
std::array a {10.0, 20.0};
return nanobind::ndarray(a.data(), { a.size() }, nanobind::handle());
})
...
Хотя это, кажется, работает, я не уверен, правильно ли это или я создаю утечку памяти, и массив указывает на память, которая освободилась после выхода из функции. В документации идет речь о владении и создании капсулы, которая обрабатывает память. Хотя это может иметь смысл для больших массивов, для маленьких массивов это кажется слишком сложным.
Есть также пример, где только nanobind::handle() (как в фрагмент выше) используется в качестве владельца, но в конкретном примере базовые данные все равно не освобождаются, поскольку они определены в глобальном пространстве.
В качестве альтернативы можно подумать о создании ndarray сначала выделяет свою память, а затем заполняет ее после. Что-то вроде

Код: Выделить всё

...
.def("test", []() {
nb::ndarray result; // array with allocated memory
std::span view(result.data(), result.data()+result.size();
std::fill(view.begin(), view.end(), 100); // arbitrary function to fill the ndarray ....
return result;
}
...
Но этот пример не работает, и я не нашел конструкторов или фабрик, которые обеспечивали бы аналогичную функциональность.
Мне также интересно: я наблюдая здесь за чем-то очевидным? Это то, что обычно не требуется, поскольку для таких проблем есть лучшие решения?

Подробнее здесь: https://stackoverflow.com/questions/787 ... ned-memory
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»