使用带有boost python.h的ntype uint8的numpy-array

时间:2015-08-28 09:38:30

标签: python c++ numpy boost

我试图使用boost / python.h来计算C ++中两个numpy数组的差异。

我的c代码看起来类似于:

#include <boost/python.hpp>
#include "boost/python/extract.hpp"
#include "boost/python/numeric.hpp"

using namespace boost::python;

void setArray(boost::python::numeric::array structure,
    boost::python::numeric::array bct,
    int size_x, int size_y,
    boost::python::numeric::array data1, boost::python::numeric::array data2,
    int data1_div, int data2_div, int neutral) {

  for (int ix = 0; ix < size_x; ix++) {
      for (int iy = 0; iy < size_y; iy++) {
        boost::uint8_t d1 = extract<boost::uint8_t>(data1[iy][ix]);
        boost::uint8_t d2 = extract<boost::uint8_t>(data2[iy][ix]);
        boost::uint8_t x = d2/data1_div + neutral - d1/data2_div;
        bct[x] += 1;
        structure[iy][ix] = x;
      }
  }
}

BOOST_PYTHON_MODULE(img_diff) {
  boost::python::numeric::array::set_module_and_type("numpy", "ndarray");
  def("setArray", &setArray);
}

如何从python中使用它的一个例子是:

import numpy as np
import img_diff

h_stripe = 3
l_stripe = 7

data1_div = 17
data2_div = 17
neutral = 16

data1 = np.array(np.random.randint(0, 16, (h_stripe, l_stripe))*data1_div, dtype=np.int)
data2 = np.array(np.random.randint(0, 16, (h_stripe, l_stripe))*data2_div, dtype=np.int)

structure = np.zeros((h_stripe, l_stripe), np.uint8)
bct = np.zeros((32, ), np.uint)

img_diff.setArray(structure, bct, l_stripe, h_stripe, data1, data2, data1_div, data2_div, neutral)

只要data1和data2的dtype是numpy.int,这样就可以了。但是,由于内存问题,我必须使用numpy.uint8。使用uint8,我收到错误

TypeError: No registered converter was able to produce a C++ rvalue of type unsigned char from this Python object of type numpy.uint8

任何人都可以解释为什么它适用于int但不适用于uint8?另外,为什么可以使用uint8作为结构?

有一个好方法,如何解决这个问题?

0 个答案:

没有答案