Передача массива списков целых чисел в методе Cython из Python - PullRequest
0 голосов
/ 12 июня 2018

Я бы хотел передать следующий массив списка целых чисел (т. Е. Это не двумерный массив) методу Cython из кода Python.

Пример кода Python :

import numpy as np
import result
a = np.array([[1], [2,3]])
process_result(a)

Выход a равен array([list([1]), list([2, 3])], dtype=object)

Пример кода Cython :

def process_result(int[:,:] a):
    pass

Приведенный выше код дает следующую ошибку:

ValueError: Buffer has wrong number of dimensions (expected 2, got 1)

Я попытался передать простой массив вместо numpy Я получил следующую ошибку

a = [[1], [2,3]]
process_result(a)

TypeError: a bytes-like object is required, not 'list'

Пожалуйста, помогите мне передать значение a в Cython метод process_result и что нужно использовать datatype, чтобы получить это значение в Cython метод.

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Я думаю, что вы используете неправильный тип данных.Вместо простого списка списков, вы должны использовать список пустых массивов.Преимущества использования пустых массивов объектов Python (таких как списки) весьма незначительны - в отличие от числовых типов, они не сохраняются особенно эффективно, они не быстро выполняют вычисления, и вы не можете ускорить их в Cython.Поэтому самый внешний уровень также может быть обычным списком Python.

Однако все внутренние уровни выглядят как однородные массивы целых чисел, и поэтому будут идеальными кандидатами для массивов Numpy (особенно, если вы хотите обработать ихв Cython).

Следовательно, создайте свой список следующим образом:

a = [ np.array([1],dtype=np.int), np.array([2,3],dtype=np.int) ]

(или используйте tolist для массива numpy)

Для своей функции вы можете определить егокак:

def process_result(list a):
    cdef int[:] item
    for item in a:
        #operations on the inner arrays are fast!
        pass

Здесь я предположил, что вы, скорее всего, хотите перебрать список.Обратите внимание, что набирать a как list довольно мало пользы, поэтому вы можете просто оставить его нетипизированным (для принятия любого объекта Python), а затем передать его и другим итерируемым элементам, таким как исходный массив numpy.

0 голосов
/ 12 июня 2018

Преобразовать массив целых чисел в список объектов (т. Е. Список целых чисел - это не двумерный массив)

Код Python:

import numpy as np
import result
a = np.array([[1], [2,3]]).tolist()
process_result(a)

Выход a равен [[1], [2,3]]

Код примера Cython:

def process_result(list a):
    pass

Измените int[:, :] на list.Он отлично работает.

Примечание : Если кто-нибудь знает оптимальный ответ, пожалуйста, напишите его, это будет полезно.

...