Сглаживание строк матрицы с горячим кодированием - PullRequest
3 голосов
/ 28 февраля 2020

Предполагая, что у меня есть следующая матрица, состоящая из строк с горячим кодированием:

X = np.array([[0., 0., 0., 1., 0.], [1., 0., 0., 0., 0.], [0., 0., 1., 0., 0.]])

Что я хочу сделать, это сгладить / развернуть горячее кодирование таким образом, чтобы получить следующий вывод:

Y = np.array([[0., 0., 1., 1., 1.], [1., 1., 0., 0., 0.], [0., 1., 1., 1., 0.]])

при условии, что я хочу сгладить / развернуть 1 элемент влево или вправо от горячего элемента. Спасибо за помощь!

Ответы [ 3 ]

2 голосов
/ 28 февраля 2020

Вы можете свернуть X с массивом из них:

from scipy.signal import convolve2d

convolve2d(X, np.ones((1,3)), mode='same')

array([[0., 0., 1., 1., 1.],
       [1., 1., 0., 0., 0.],
       [0., 1., 1., 1., 0.]])
2 голосов
/ 28 февраля 2020

Мы можем использовать convolution -

In [22]: from scipy.signal import convolve2d

In [23]: convolve2d(X,np.ones((1,3)),'same')
Out[23]: 
array([[0., 0., 1., 1., 1.],
       [1., 1., 0., 0., 0.],
       [0., 1., 1., 1., 0.]])

С binary-dilation для большей эффективности памяти -

In [43]: from scipy.ndimage.morphology import binary_dilation

In [46]: binary_dilation(X,np.ones((1,3), dtype=bool)).view('i1')
Out[46]: 
array([[0, 0, 1, 1, 1],
       [1, 1, 0, 0, 0],
       [0, 1, 1, 1, 0]], dtype=int8)

Или, поскольку у нас только 0 и 1, универсальный фильтр будет также работает, и дополнительно мы можем использовать его вдоль общей оси c (ось = 1 в нашем случае) и должно быть лучше на перф. -

In [47]: from scipy.ndimage import uniform_filter1d

In [50]: (uniform_filter1d(X,size=3,axis=1)>0).view('i1')
Out[50]: 
array([[0, 0, 1, 1, 1],
       [1, 1, 0, 0, 0],
       [0, 1, 1, 1, 0]], dtype=int8)
0 голосов
/ 28 февраля 2020

Решение, основанное на стандарте np.convolve:

import numpy as np
np.array([np.convolve(x, np.array([1,1,1]), mode='same') for x in X])

Итерирование строк с использованием понимания списка для свертки, затем преобразование обратно в np.array

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...