2016-12-26 4 views
2

Учитывая размерность, n и логический оператор, я хочу видеть, сравнивается ли заданный тензор с соответствующими размерами с (i + 1) th на (i + n) -й срез вдоль данного измерения на применяя оператор.Сравнение значений нескольких строк по размеру

Другими словами, в более конкретном случае, скажем, у меня есть массив из двух измерений, и я хочу сравнить 5 значений. Мне нужно создать логический массив, где первая строка будет иметь в первом столбце true, если все следующие 5 значений будут больше 1-го значения. Аналогично по столбцам и следующим строкам, которые в первом столбце будут сопоставлять значения в первом столбце строки 3-8 с этим или 1-м столбцом в строке 2.

.

[[1, 1], 
[2, 2], 
[3, 3], 
[4, 4], 
[5, 5], 
[6, 0], 
[7, 1], 
[8, 2]] 

должен дать:

[[True, False], 
[True, False], 
[True, False]] 

Когда оператор all >= (который предполагает, что все последующие 5 пунктов должно быть больше или равно) и количество элементов для сравнения 5 и сравнение строк мудрый (ось 0).

Я хочу сделать это в Numpy или Pandas, но предпочитаю Numpy.

+0

Не могли бы вы, пожалуйста, приведите пример с определенным тензором (2-мерный массив, например) и желаемый результат? – Fomalhaut

+0

Добавлен пример. –

ответ

1

Один трюк будет использовать Scipy's 1D minimum filter и сравнить текущий элемент с минимальным интервалом, начиная с первого после текущего и длиной n. Проверяя минимум на этом интервале, мы в основном проверяем для greater-than все элементы.

Таким образом, мы получили бы решение, как так -

from scipy.ndimage.filters import minimum_filter1d as minf 

def rolling_comparison(a, W): 
    HW = (W-1)//2 # Half window size for offsetting kernel in min filter 
    v = minf(a,W,origin=-HW) 
    return v[:,1:] > a[:,:-1] 

Вот тестовый образец с различными размерами окна -

In [245]: a 
Out[245]: 
array([[59, 86, 77, 31, 91, 88, 13, 77, 77, 39], 
     [12, 63, 98, 21, 69, 89, 93, 38, 52, 62], 
     [29, 58, 42, 74, 22, 27, 23, 40, 37, 11]]) 

In [246]: rolling_comparison(a, W=3) 
Out[246]: 
array([[False, False, False, False, False, False, True, False, False], 
     [ True, False, False, True, False, False, False, True, False], 
     [ True, False, False, False, True, False, False, False, False]]) 

In [247]: rolling_comparison(a, W=5) 
Out[247]: 
array([[False, False, False, False, False, False, True, False, False], 
     [ True, False, False, True, False, False, False, False, False], 
     [False, False, False, False, False, False, False, False, False]]) 

In [248]: rolling_comparison(a, W=7) 
Out[248]: 
array([[False, False, False, False, False, False, False, False, False], 
     [ True, False, False, True, False, False, False, False, False], 
     [False, False, False, False, False, False, False, False, False]]) 

Решая пример случай

Теперь, перечисленный подход работает вдоль каждой строки двумерного массива. Кажется, вы хотите, чтобы он работал на основе столбцов. Кроме того, перечисленный подход reflects граничные элементы для границы, тогда как в вашем случае вас интересуют только действительные элементы. Итак, чтобы адаптироваться к вашему делу, нам нужно использовать transpose и клип в размере первого полу окна.

Таким образом, адаптация к вашему делу, мы имели бы -

In [82]: a 
Out[82]: 
array([[1, 1], 
     [2, 2], 
     [3, 3], 
     [4, 4], 
     [5, 5], 
     [6, 6], # Made the second elem as 6 for variety 
     [7, 1], 
     [8, 2]]) 

In [83]: rolling_comparison(a.T, W=5).T[:3] # 3 is half window size for 5 
Out[83]: 
array([[ True, True], 
     [ True, False], 
     [ True, False]], dtype=bool) 
+0

+1, Большое спасибо за ответ. Это проливает некоторый свет, но просто хотел бы указать, что 'minf' может не работать, если оператор' == '. –

+0

Также 'W = 5' и' W = 7' должны постепенно уменьшать элементы, чем случай W = 3. –

+0

@ SumindaSirinathS.Dharmasena Как отмечалось в сообщении, минимальный фильтр предназначен исключительно для работы по большей, чем проблема. Кроме того, это решение предполагает, что мы работаем по каждой строке, но в примере вы делаете это по каждому столбцу. Итак, чтобы адаптироваться к вашему делу, просто переставьте его. – Divakar