Фильтр Scipy с многомерным (или нескалярным) выходом

Есть ли фильтр, похожий на ndimage ndimage, который поддерживает векторный вывод? Мне не удалось заставить scipy.ndimage.filters.generic_filter возвращать больше, чем скаляр. Раскомментируйте строку в приведенном ниже коде, чтобы получить ошибку: TypeError: only length-1 arrays can be converted to Python scalars .

Я ищу общий фильтр, который обрабатывает 2D или 3D-массивы и возвращает вектор в каждой точке. Таким образом, выход будет иметь одно добавленное измерение. Для примера ниже я ожидал бы что-то вроде этого:

 m.shape # (10,10) res.shape # (10,10,2) 

Пример кода

 import numpy as np from scipy import ndimage a = np.ones((10, 10)) * np.arange(10) footprint = np.array([[1,1,1], [1,0,1], [1,1,1]]) def myfunc(x): r = sum(x) #r = np.array([1,1]) # uncomment this return r res = ndimage.generic_filter(a, myfunc, footprint=footprint) 

2 Solutions collect form web for “Фильтр Scipy с многомерным (или нескалярным) выходом”

generic_filter ожидает, что myfunc вернет скаляр, а не вектор. Однако нет ничего, что мешало бы myfunc также добавлять информацию, например, в список, который передается myfunc в качестве дополнительного аргумента.

Вместо использования массива, возвращаемого generic_filter , мы можем сгенерировать наш векторнозначный массив, изменив этот список.


Например,

 import numpy as np from scipy import ndimage a = np.ones((10, 10)) * np.arange(10) footprint = np.array([[1,1,1], [1,0,1], [1,1,1]]) ndim = 2 def myfunc(x, out): r = np.arange(ndim, dtype='float64') out.extend(r) return 0 result = [] ndimage.generic_filter( a, myfunc, footprint=footprint, extra_arguments=(result,)) result = np.array(result).reshape(a.shape+(ndim,)) 

Я думаю, что получаю то, о чем вы просите, но я не совсем уверен, как работает ndimage.generic_filter (насколько ndimage.generic_filter является источник!).

Вот просто простая функция обертки. Эта функция будет принимать массив, все параметры ndimage.generic_filter нужны. Функция возвращает массив, в котором каждый элемент предыдущего массива теперь представлен массивом с формой (2), результат функции сохраняется как второй элемент этого массива.

 def generic_expand_filter(inarr, func, **kwargs): shape = inarr.shape res = np.empty(( shape+(2,) )) temp = ndimage.generic_filter(inarr, func, **kwargs) for row in range(shape[0]): for val in range(shape[1]): res[row][val][0] = inarr[row][val] res[row][val][1] = temp[row][val] return res 

Вывод, где res обозначает только generic_filter а res2 обозначает generic_expand_filter , этой функции является:

 >>> a.shape #same as res.shape (10, 10) >>> res2.shape (10, 10, 2) >>> a[0] array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]) >>> res[0] array([ 3., 8., 16., 24., 32., 40., 48., 56., 64., 69.]) >>> print(*res2[0], sep=", ") #this is just to avoid the vertical default output [ 0. 3.], [ 1. 8.], [ 2. 16.], [ 3. 24.], [ 4. 32.], [ 5. 40.], [ 6. 48.], [ 7. 56.], [ 8. 64.], [ 9. 69.] >>> a[0][0] 0.0 >>> res[0][0] 3.0 >>> res2[0][0] array([ 0., 3.]) 

Конечно, вы, вероятно, не хотите сохранять старый массив, но вместо этого должны иметь оба поля в качестве новых результатов. Кроме того, я не знаю, что именно вы имели в виду, если два значения, которые вы хотите сохранить, не связаны друг с другом, просто добавьте temp2 и func2 и вызовите другой generic_filter с теми же **kwargs и сохраните это как первое значение.

Однако, если вы хотите, чтобы фактическая векторная величина была рассчитана с использованием нескольких элементов inarr , что означает, что два новых созданных поля не являются независимыми, вам просто нужно написать такую ​​функцию, которая принимает массив, idx , idy и возвращает значение tuple \ list \ array, которое затем можно распаковать и присвоить результату.

  • как интерпретировать значения numpy.correlate и numpy.corrcoef?
  • Каков наиболее эффективный способ установки строк в нули для разреженной матрицы scipy?
  • Присоединение данных с интегральной функцией
  • Как я могу «разделить» на два значения?
  • Распределение распределения с фиксированными параметрами в SciPy
  • Любая хорошая реализация жадного набора для больших наборов данных?
  • Как найти и удалить белые пятна с изображения с помощью SciPy / NumPy?
  • получить значение R ^ 2 из scipy.linalg.lstsq
  •  
    Interesting Posts for Van-Lav

    Рекурсивное слияние питона не работает

    cx_Oracle.InterfaceError: невозможно получить доступ к среде Oracle с Mac

    Сценарий Python не продолжается до закрытия окна сцены Mayavi

    Интерполяция и экстраполяция случайно рассеянных данных в единую сетку в 3D

    Ошибка MongoKit "ImportError: No module named objectid"

    Выбор элементов только в том случае, если они имеют два класса и имеют один и тот же первый

    Путь к текущему файлу зависит от того, как я выполняю программу

    Как получить порядок определения атрибутов класса в Python?

    Анализ HTML не выводит требуемые данные (информация отслеживания для FedEx)

    В Python 3.2 «лямбда» считается «ключевым словом», «оператором» или и тем, и другим?

    Подпроцесс Popen не работает с pythonw.exe

    Как вы сортируете файлы численно?

    Найти индексы по двум спискам на основе состояния элементов

    Pandas DataFrame, как разбить столбец на два

    Хранение объектов пользователя в Google App Engine

    Python - лучший язык программирования в мире.