首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不允许使用PyBind11数组的函数进行复制

不允许使用PyBind11数组的函数进行复制
EN

Stack Overflow用户
提问于 2021-05-23 20:00:51
回答 1查看 119关注 0票数 2

我已经创建了一个函数,它以py::array_t<double>作为输入。

当从Python调用它时,我可以将一个NumPy数组作为输入传递给float32或float64 dtype。我的问题是,如果使用前一个dtype,它将不可避免地产生一个数组的“静默”副本,以便将其强制到float64。

我想禁用所有这样的无声副本(例如,如果传递一个float32数组,就会产生一个错误)。

出于同样的原因,我也不允许输入是C-连续的,因为我的函数假定C-连续。

这些事情中的任何一件可以(很容易地)用PyBind11做吗?

EN

回答 1

Stack Overflow用户

发布于 2022-01-13 18:24:44

我所发现的最好的方法是把它当作一种论据,而不是

代码语言:javascript
运行
复制
py::array_t<double> &my_object  

而是相反

代码语言:javascript
运行
复制
py::buffer  & my_object  

哪一个更一般

然后

代码语言:javascript
运行
复制
py::buffer_info buffer_info  = my_object.request();
if( buffer_info.format[0] != 'd') {
   throw std::invalid_argument("The argument  must be an array of float64");
}

缓冲器结构包含n线团、形状、步幅、项大小等。这样,您就可以检查数组是否是连续的,c_style,f_style。数据本身是有效成员*ptr。

检查邻接性

代码语言:javascript
运行
复制
bool check_c_contiguity(py::buffer_info &info) {
    int ndim = info.ndim;
    size_t stride = 0;
    size_t prod=1;
    for(int i=ndim-1; i>=0; i--) {

      stride =  prod * info.itemsize ;

      prod = prod * info.shape[i];
      
      if ( stride != info.strides[i] ) {
    return false;
      }
    }
    return true;  
  }
  bool check_f_contiguity(py::buffer_info &info) {
    int ndim = info.ndim;
    size_t stride = 0;
    size_t prod=1;
    for(int i=0; i<ndim; i++) {

      stride = prod * info.itemsize;
      prod = prod * info.shape[i];

      if ( stride != info.strides[i] ) {
    return false;
      }
    }
    return true;  
  }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67663847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档