Мне трудно использовать 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 ++. Таким образом, вопросы все еще остаются открытыми в теории ...