C ++, Python, несовместимые типы чисел - PullRequest
1 голос
/ 12 октября 2011

Мне трудно использовать vector_indexing_suite в Boost. В C ++ я определил:

  class_<std::vector<double> >("PyVecDouble")
                         .def(vector_indexing_suite<std::vector<double> >());

и

  class_<std::vector<long> >("PyVecLong")
                         .def(vector_indexing_suite<std::vector<long> >());

И в python я попытался использовать их в следующей простой программе:

def NumpyArrayToPyVecDouble(vec):
    n = len(vec)
    p_vec = jp.PyVecDouble()

    for i in xrange(0,n):
        p_vec.append(vec[i])

    return p_vec

def NumpyArrayToPyVecLong(vec):
    n = len(vec)
    p_vec = jp.PyVecLong()

    for i in xrange(0,n):
        p_vec.append(vec[i])

    return p_vec

example_array = np.array([1.1, 2.2, 3.3, 4.4])
example = NumpyArrayToPyVecDouble(double_array)

dates_array = np.array([01122011, 01062012, 01122012, 01062013])
dates = NumpyArrayToPyVecLong(dates_array)

В результате программа вычисляет пример вектора, но возвращает следующую ошибку, когда пытается вычислить векторные даты:

TypeError: Attempting to append an invalid type

А идеи почему? Longs в C ++ несовместимы с Python? Это также не работает, когда я заменяю long везде на int. Помощь очень ценится!

! UPDATE! NumpyArrayToPyVecLong отлично работает, когда вводится в виде списка python, а не в виде массива numpy. Я пытался создать различные типы массивов numpy (int16, int32, int64, uint16 и т. Д.), Но ни один из них не работает. Это работает только когда дан простой список питонов. Есть идеи, почему эти типы несовместимы с C ++ long?

! UPDATE! второй: Решением для этого является просто использование p_vec.append(vec[i]), но на самом деле это не решает проблему выравнивания массивов и типов C ++. Таким образом, вопросы все еще остаются открытыми в теории ...

1 Ответ

1 голос
/ 16 октября 2011

Здесь перечислены отношения между типами Numpy и C (см. Разделы «совместимость: C ...»): http://docs.scipy.org/doc/numpy/reference/arrays.scalars.html#built-in-scalar-types

Типы, указанные в размере (int16 и т. Д.), Отображаются в C int, long, long long и т. Д. В зависимости от платформы. numpy/ndarrayobject.h однако определяет typedefs npy_int8 и т. Д.

...