2017-03-21 5 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、私はデータをコピーしないことを指定する質問を編集しました。それを「公開」するだけです。たとえば、配列の1つの要素を変更することができます。 – 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'(8ビット)ではなく、 'bool *'(64ビット)をすべてコピーする必要はありません。 – bibi

関連する問題