2017-12-16 3 views
0

이것은이 사이트에 대한 나의 첫 번째 질문입니다.<numpy/arrayobject.h>를 사용하여 cpu에서 np.array의 데이터를 std :: vector로 가져 오는 방법은 무엇입니까?

우선, 나는 C++에서 파이썬을위한 하나의 함수를 가진 모듈을 만들 필요가있다. 이것은 numpy와 함께 작동해야하며, <numpy/arrayobject.h>을 사용한다. 이 함수는 numpy 배열 하나를 취해 두 개의 numpy 배열을 반환합니다. 모든 배열은 1 차원입니다.

첫 번째 질문은 numpy 배열에서 데이터를 가져 오는 방법입니다. std :: vector 배열에서 정보를 수집하려면 C++로 쉽게 작업 할 수 있습니다.

둘째 : 그 함수는 배열의 튜플을 반환해야합니다. 그렇다면 제 모듈의 사용자는 파이썬에서 다음과 같이 작성할 수 있습니다 : arr1, arr2 = foo(arr) ? 그리고 어떻게 돌아갈 수 있을까요?

대단히 감사합니다.

+0

당신은 물어 보는 법을 개선하기 위해 https://stackoverflow.com/help/how-to-ask를 확인할 수 있습니다. –

+0

C++이기 때문에 [PyBind11] (http://pybind11.readthedocs.io/en/stable/)을 살펴볼 것입니다. – Daniel

답변

0

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 객체 만 포함됩니다.

+0

정말 고마워요! 따라서, 함수'PyArray_GetArrayParamsFromObject'를 호출하여 수적으로 배열 된 형태에 대한 정보를 얻을 수 있습니까? 그리고 나서 객체의 모양을 돌려 주길 원합니다. –

+0

@InFamousX 잘 작동 할 것이지만,'PyArray_NDIM()'과'PyArray_DIMS()'매크로를 사용하는 것이 더 일반적입니다. 전자의 함수는 파이썬 고유의 객체 (리스트와 같은)를'ndarray'로 변환하는데 더 자주 사용됩니다. – bnaecker

+0

죄송 합니다만,이주기'for (int ...)'는 제대로 작동하지 않습니다. 왜냐하면 나는 그저 0 밖에 없기 때문입니다. –

관련 문제