NumPy에는 lots of functions and macros이 포함되어있어 C 또는 C++ 확장자 내에서 ndarray
개체의 데이터에 쉽게 액세스 할 수 있습니다. v
이라고하는 1D ndarray
이 주어지면 i
요소에 PyArray_GETPTR1(v, i)
으로 액세스 할 수 있습니다.
npy_intp vsize = PyArray_SIZE(v);
std::vector<double> out(vsize);
for (int i = 0; i < vsize; i++) {
out[i] = *reinterpret_cast<double*>(PyArray_GETPTR1(v, i));
}
: 동일한 유형의 std::vector
에 배열의 각 요소를 복사 할 경우 그래서 (내가 double
의 배열을 믿고있어) 같은, 당신은 그것을 각 요소를 반복하고 복사 할 수 있습니다 memcpy
과 유사한 작업을 수행 할 수도 있지만 NumPy ndarray
은 데이터 유형에 대해 잘못 정렬되거나, 기본이 아닌 바이트 순서 또는 그러한 복사본을 적게는 다른 미묘한 속성을 가질 수 있습니다. 지금 ndarray
의 데이터의 복사본을 포함 out
접근 방식 중 하나를 사용
npy_intp vsize = PyArray_SIZE(v);
std::vector<double> out(vsize);
std::memcpy(out.data(), PyArray_DATA(v), sizeof(double) * vsize);
, 당신은 그러나 당신이 좋아하는 조작 할 수 있습니다 :하지만 당신이 알고있는 가정, 하나는 할 수 있습니다. std::vector
으로 데이터가 실제로 필요하지 않는 한 NumPy C API는 Extension에서 데이터에 액세스하고 조작하는 방법으로 완벽하게 사용할 수 있습니다. 즉, 이이되어야하거나 다른 std::vector
에 의존하는 C++ 라이브러리 코드를 사용하고자하는 다른 함수에 데이터를 전달해야하는 경우가 아니면 원시 배열 유형에서 직접 모든 처리를 수행하는 것이 좋습니다.
마지막 질문에 대해서는 일반적으로 PyArg_BuildValue
을 사용하여 확장 기능에서 반환되는 튜플을 구성합니다. 튜플에는 두 개의 ndarray
객체 만 포함됩니다.
당신은 물어 보는 법을 개선하기 위해 https://stackoverflow.com/help/how-to-ask를 확인할 수 있습니다. –
C++이기 때문에 [PyBind11] (http://pybind11.readthedocs.io/en/stable/)을 살펴볼 것입니다. – Daniel