2017-03-21 58 views
2

使用PyArray_SimpleNewFromData,很容易將std::vector作爲numpy數組公開。我現在試圖做相反的事情:暴露一個numpy數組作爲C++向量。將numpy數組公開爲C++向量

暴露爲C陣列是可能的:

// get the size 
npy_intp s = PyArray_SIZE(numpy_array); 
// get the pointer to the array 
bool* c_array = (bool*) PyArray_GETPTR1(numpy_array, 0); 
// Do something 
for(unsigned int i=0; i<s; i++) 
    c_array[i] = ... ; 

現在怎麼樣一個C++矢量代替的C數組?

編輯:我不想複製數據,否則答案是微不足道的。

+0

你可以只是簡單地構造一個新的向量使用數組作爲初始化... – JHBonarius

+0

@ J.H.Bonarius,我編輯了問題,指定我不想複製數據。只是「揭露」它。例如,我可能想要修改數組的一個元素。 – fffred

回答

0

假設您不想將數據複製到std::vector,您可能會發現std::reference_wrapper有用。

int main() 
{ 
    std::vector<int> numpy_array_{ 1, 2, 3, 4 }; 
    const auto s = numpy_array_.size(); 
    auto arr = numpy_array_.data(); 

    // ... 

    for (size_t i = 0; i < s; i++) 
     arr[i] += 10; 

    const std::vector<std::reference_wrapper<int>> v(arr, arr + s); 
    void f(const std::vector<std::reference_wrapper<int>>&); 
    f(v); 

    return 0; 
} 

void f(const std::vector<std::reference_wrapper<int>>& v) 
{ 
    for (size_t i = 0; i < v.size(); i++) 
     v[i] += 100; 
} 

注意,std::vectorconst使得尺寸不能改變;這將C風格的數組保留爲「主」。

當然,你可以很容易地只將數據複製到std::vector<>太:

std::vector<int> v(arr, arr + s); 

...甚至再次複製回來,如果有必要

std::copy(v.begin(), v.begin()+s, arr); 

(假設相同的尺寸或更小)最後,請注意std::vector<bool>是特殊的,不會像普通的C風格數組那樣工作。

+0

你從一個向量開始...對於一個適當的例子,你應該從一個數組開始;) – JHBonarius

+0

我已經用numpy代碼模擬; 'arr'是一個C風格的數組。 –

+0

使用'std :: vector '是否需要不復制所有的'bool'(8bits),但每個'bool *'(64bits)使這個答案比複製整個布爾向量更糟? – bibi