Как вы используете / просматриваете объекты памяти в Cython? - PullRequest
0 голосов
/ 02 мая 2020

У меня есть проект, в котором несколько вложенных циклов for замедляют время выполнения кода, поэтому я начал реализовывать некоторую типизацию Cython, и это значительно ускорило время выполнения циклов, но я столкнулся с новая проблема, типизация, которую я использую, не позволяет выполнять какие-либо вычисления для них. Вот макет моего кода:

cdef double[:,:] my_matrix = np.zeros([width, height])

for i in range(0,width):
  for j in range(0,height):
    a = v1[i] - v2[j]
    my_matrix[i,j] = np.sqrt(a**2)

После этого я хочу вычислить произведение my_matrix, используя

  • Комплексное число
  • Две константы
  • Экспоненциальная функция
  • Сама матрица, например, так:

product = constant1 * np.exp(-1j * constant2 * my_matrix) / my_matrix

При попытке этого я получаю ошибку:

TypeError: unsupported operand type(s) for *: 'complex' and 'my_cython_function_cy._memoryviewslice'

Я понимаю смысл этой ошибки, но я не понимаю, как использовать содержимое объекта memoryview в качестве массива, я попытался сделать это;

    new_matrix = my_matrix

но это не скомпилируется. Я новичок как в C, так и в Cython, и документация не очень полезна для ответов на эти ладьи ie, поэтому я был бы очень признателен за любую помощь здесь.

1 Ответ

1 голос
/ 02 мая 2020

Лучшее, что можно сделать:

new_matrix = np.as_array(my_matrix)

Это позволяет получить доступ к полному набору Numpy операций над массивом. Это должно быть довольно легкое преобразование (они будут использовать одни и те же базовые данные).


Вы также можете получить обернутый объект с помощью my_matrix.base (это, вероятно, будет исходный массив Numpy, который Вы инициализировали это с). Однако, в зависимости от того, что вы сделали с нарезкой, это может не совпадать с обзором памяти, так что будьте осторожны с этим подходом.

...