我已经创建了一个函数,它以py::array_t<double>作为输入。
当从Python调用它时,我可以将一个NumPy数组作为输入传递给float32或float64 dtype。我的问题是,如果使用前一个dtype,它将不可避免地产生一个数组的“静默”副本,以便将其强制到float64。
我想禁用所有这样的无声副本(例如,如果传递一个float32数组,就会产生一个错误)。
出于同样的原因,我也不允许输入是C-连续的,因为我的函数假定C-连续。
这些事情中的任何一件可以(很容易地)用PyBind11做吗?
发布于 2022-01-13 18:24:44
我所发现的最好的方法是把它当作一种论据,而不是
py::array_t<double> &my_object  而是相反
py::buffer  & my_object  哪一个更一般
然后
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。
检查邻接性
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;  
  }https://stackoverflow.com/questions/67663847
复制相似问题