【问题标题】:C++, Python, Incompatible Types of NumbersC++、Python、不兼容的数字类型
【发布时间】:2011-12-05 22:52:31
【问题描述】:

我在使用 Boost 中的 vector_indexing_suite 时遇到了困难。 在 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

以及为什么? C++ 中的 Long 与 Python 不兼容吗?当我用 int 替换 long 时,这也不起作用。非常感谢您的帮助!

!更新! 当将输入作为 python 列表而不是 numpy 数组给出时,NumpyArrayToPyVecLong 工作正常。我尝试过制作各种类型的 numpy 数组(int16、int32、int64、uint16 等),但它们都不起作用。它仅在给定一个普通的 python 列表时才有效。任何想法为什么这些类型都与 C++ long 不兼容?

!更新!第二: 一个解决方案就是使用p_vec.append(vec[i]),但这实际上并不能解决numpy数组和C++类型如何对齐的问题。所以问题在理论上仍然是开放的......

【问题讨论】:

    标签: c++ python types vector typeerror


    【解决方案1】:

    这里列出了 Numpy 和 C 类型之间的关系(检查“兼容:C ...”部分): http://docs.scipy.org/doc/numpy/reference/arrays.scalars.html#built-in-scalar-types

    大小指定的类型(int16 等)以特定于平台的方式映射到 C intlonglong long 等。 numpy/ndarrayobject.h 然而定义了 typedefs npy_int8 等等。

    【讨论】:

      猜你喜欢
      • 2011-07-07
      • 2022-06-14
      • 1970-01-01
      • 2021-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-12
      • 1970-01-01
      相关资源
      最近更新 更多