Как определить, является ли PyObject numpy PyArrayObject

#python #numpy #python-c-api

#python #numpy #python-c-api

Вопрос:

Я новичок в Python C-API.

В настоящее время я получаю объекты из встроенного модуля Python через

 PyObject* a = (PyObject*) PyObject_GetAttrString(pModule, "a");
std::cout << "a as long is " << PyLong_AsLong(a) << std::endl;
  

Я получаю доступ к объектам numpy через

 PyArrayObject* array = (PyArrayObject*) PyObject_GetAttrString(pModule, "A");
  

Как я могу проверить, действительно ли объект является a PyArrayObject ? Другими словами, как сделать то, что я бы сделал в Python через isinstance(a, numpy.ndarray) ?

Ответ №1:

Используйте PyArray_Check или PyArray_CheckExact . Используйте PyArray_Check , если подклассы в порядке, или PyArray_CheckExact если вам нужен объект с точным типом numpy.ndarray .

Комментарии:

1. Это не работает для меня ?! Но я должен отметить, что я также не могу выделить массив numpy со стороны C (тот же код на macOS с clang и Linux с gcc 10). std::cout << "check a: " << PyArray_Check(a) << std::endl; результаты isinstance : unknown location:0: fatal error: in embedded_python: memory access violation at address: 0x00000010: no mapping at fault address

2. Я допустил ошибку, вставив свою ошибку: это check a: unknown location:0: fatal error: in "embedded_python": memory access violation at address: 0x00000010: no mapping at fault address — оба решения не работают для меня ?!

3. Это звучит как новый вопрос. Вместо того, чтобы пытаться выяснить это здесь, в комментариях, создайте новый вопрос об ошибке.