Коэффициент корреляции Python для 3D-массива

#python #numpy

#python #numpy

Вопрос:

Есть ли способ вычислить коэффициент корреляции для движущегося окна над 3D-массивом? Когда я запускаю:

 Import numpy as np
from scipy.ndimage.filters import generic_filter

arr_3d = np.dstack((data1,data2))

def function(arr_3d):
    return np.corrcoef(arr_3d[:,:,0],arr_3d[:,:,1])

gen_filt = generic_filter(arr_3d, function, footprint=np.ones((7,7,2)), mode='nearest')
  

Ошибка, которую я продолжаю получать, такова.

 Traceback (most recent call last):
  File "correlate.py", line 251, in <module>
    plot_data()
  File "correlate.py", line 219, in plot_data
    gen_filt = generic_filter(arr_3d,function,footprint=np.ones((35,35,2)),mode='nearest')
  File "/apps/python/3.5.1/lib/python3.5/site-packages/scipy/ndimage/filters.py", line 1245, in generic_filter
    cval, origins, extra_arguments, extra_keywords)
  File "correlate.py", line 217, in function
    return np.corrcoef(arr_3d[:,:,0],arr_3d[:,:,1])
IndexError: too many indices for array
  

Вот пример того, как выглядят некоторые данные. Функция dstack, похоже, успешно создает 3D-массив.

 data1 = np.random.randint(1,100,size=(10,10))
data2 = np.random.randint(1,100,size=(10,10))

arr_3d = np.dstack((x,y))
print(arr_3d.shape)

(10, 10, 2)
  

Я не включил здесь arr_3d, но после просмотра он оказался правильно отформатированным.

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

1. Пожалуйста, распечатайте полный стек ошибок. Спасибо

2. Спасибо за редактирование сообщения. Вы уверены, arr_3d что это на самом деле 3d? Не могли бы вы, пожалуйста, распечатать его форму с помощью arr_3d.shape ? Без данных трудно отлаживать. может быть, игрушечный пример данных для data1 и data2 поможет.

3. Похоже, что dstack создает 3D-массив. Я включил небольшой пример данных. Я думаю, что проблема может быть в том, что np.corrcoef создает 2d-массив, но arr_3d и footprint являются 3d, но я не уверен.

4. Это не работает, потому что функция в generic_filter должна возвращать скаляр для пары входных данных по назначенному фильтру. Чего вы пытаетесь достичь? Я думаю, что такое использование generic_filter — неправильный путь. Может быть, вы можете уточнить свою первоначальную проблему, и мы сможем помочь лучше. Спасибо

Ответ №1:

Вот корреляция движущегося окна с использованием другого метода:

 from skimage.util import view_as_windows

#this is your window shape
window = (7,7,2)
windows = view_as_windows(arr_3d, window).reshape(-1, *window)
window_corr = np.array([np.corrcoef(item[:,:,0], item[:,:,1]) for item in windows])
  

Вы также можете избежать цикла for за счет вычисления корреляции всех окон, но я думаю, что в этом случае цикл выполняется быстрее (если нет лучшего векторизованного способа корреляции между элементами 3D-массива)

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

1. Спасибо за ваш ответ! Казалось, что это работает хорошо. Знаете ли вы, как эта функция работает с ребрами? ‘scipy.ndimage.generic_filter’ имеет разные параметры для работы с границами, делает ли view_as_windows это автоматически? Кроме того, форма arr_3d равна (148,334,2), а форма window_corr равна (34200, 70, 70). Почему это?

2. Вот документ для этого: scikit-image.org/docs/dev/api/skimage.util.html . Как вы хотите работать с краями? и какова ваша исходная форма массива и каков размер вашего окна? без этой информации фигуры, на которые вы ссылаетесь, бессмысленны.