Ошибка при попытке доступа к элементам массива numpy внутри функции | Cython [дубликат]

Недавно я написал HTML-дезинфицирующее средство в Java. Он основан на смешанном подходе регулярных выражений и Java-коде. Лично я ненавижу регулярные выражения и его глупость (читаемость, ремонтопригодность и т. Д.), Но если вы уменьшите объем своих приложений, это может соответствовать вашим потребностям. Во всяком случае, мой дезинфицирующее средство использует белый список для тегов HTML и черный список для некоторых атрибутов стиля.

Для вашего удобства я создал игровое поле, чтобы вы могли проверить, соответствует ли код вашим требованиям: игровая площадка и код Java . Ваши отзывы будут оценены.

Существует небольшая статья, описывающая эту работу в моем блоге: http://roberto.open-lab.com

4
задан user357269 28 January 2017 в 21:02
поделиться

1 ответ

Существует несколько рабочих раундов:

  1. Назначьте тип переменной только внутри внутренней функции:
    def f(a):
        def g (double b):
            cdef np.ndarray[double, ndim=1] a_typed = a
            return a_typed+b
    
        return g(1)
    
    Это имеет небольшую стоимость, связанную с проверкой типа при каждом вызове g, значение которого зависит от того, сколько другой работы вы делаете в g.
  2. Используйте смесь изображений памяти и нетипизированных переменных.
    def f(a):
       cdef double[:] memview_of_a = a
    
       def g(double b):
           memview_of_a[0] = 0 # example of indexing operation
           return a+b
    
       return g(1)
    
    Следует помнить, что memview_of_a и a просматривают одни и те же данные, поэтому вы можете получить к нему доступ двумя способами. Индексирование массивов выполняется с учетом памяти. [Info]

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

2
ответ дан DavidW 17 August 2018 в 09:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: