Я просто хочу вернуть 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
Мобильная версия