Перебор столбцов ndarray в C / C ++ - PullRequest
0 голосов
/ 04 июля 2019

Как получить представление PyArrayObject *, похожее на следующий код Python?

# n-column array x
# d is the length of each column
print(x.shape)  # => (d, n)

by_column = [x[::,i] for i in range(x.shape[1])]

assert len(by_column) == n

print(by_column[n-1].shape)  # => (d,)

Пока мой код такой:

// my_array is a PyArrayObject* 
std::vector<PyArrayObject*> columns = {};

npy_intp* dims = my_array->dimensions;
npy_intp* strides = my_array->strides;

std::vector<int> shape = {};
for (int i = 0; &dims[i] != strides; i++){
    shape.push_back(dims[i]);
}

switch (shape.size()) {
    case 1: {
        // handle 1D array by simply iterating
    }
    case 2: {
        int columns = shape[1];
        // What now?
    }
}

У меня проблемы с поиском какой-либо ссылки на это в C / C ++ как в документации, так и в исходном коде. Не могли бы вы привести пример того, как это можно сделать?

API C / C ++ для numpy выглядит действительно запутанным по сравнению с чем-то вроде std :: vector, и документация также не очень удобна для новичков, поэтому любые ссылки на более простые руководства также будут приветствоваться.

1 Ответ

1 голос
/ 04 июля 2019

Вы должны получить доступ к внутренней структуре PyArrayObject с помощью таких функций PyArray_XXX, как PyArray_NDIM . Чтобы получить содержимое последовательности, вы используете PyObject_GetItem с ключом кортежа, где в вашем случае кортеж будет иметь PySliceObject в качестве первого элемента.

...