2016-06-05 3 views
2

Я выходы из процесса, которые производят тенденции данных, как показано ниже:Обнаружение Диагонали в матрице

Выходные данные, кажется, имеет тенденцию диагоналей, однако я не уверен, о том, как Я могу это отслеживать. В конечном счете, я знаю первые 15 номеров в каждом примере из 16 номеров и хочу предсказать 16-е. Похоже, вы должны иметь возможность сделать это с некоторым приближением, которое включает матричную математику или возможный фазовый сдвиг в рядах Фурье. Есть ли способ, который мог бы достичь этого? Если есть решение, которое можно использовать через Python, это было бы предпочтительнее.

+0

Я не знаю, если 'NumPy' имеет аккуратную функцию для этого, но вы могли бы всегда петля над строками, а затем цикл над столбцами и проверить, является ли элемент 'i'th в строке' j'th равным элементу в строке 'i + 1'th и' j-1'th. Очевидно, убедитесь, что вы ввели гарантии для диапазона индексов. – Petar

+1

Кроме того, когда вы говорите, что хотите * отслеживать/обнаруживать * эту тенденцию, что вы имеете в виду? Что вы хотите с этим делать? – Petar

+0

@PPG Я попробовал метод, подобный тому, что вы описали. Проблема в том, что переход от A1 к A2 идет вперед во времени, так что это не обязательно известно при попытке предсказать P1. Это исторические данные. Я попытался создать базу данных для поиска, но это должно было быть настолько большим, что оно приближалось и приближалось к 50% вероятности 0 или 1. Я хочу взять первые 15 чисел и определить, будет ли 16-й будет 0 или 1. – paperstsoap

ответ

1

Вот пример того, как проверить, содержат ли противоположные диагонали только 1 с, как в вашем случае:

In [52]: from scipy.sparse import eye 

давайте создадим матрицу с противоположной диагонали

In [53]: a = np.fliplr(eye(5, 8, k=1).toarray()) 

In [54]: a 
Out[54]: 
array([[ 0., 0., 0., 0., 0., 0., 1., 0.], 
     [ 0., 0., 0., 0., 0., 1., 0., 0.], 
     [ 0., 0., 0., 0., 1., 0., 0., 0.], 
     [ 0., 0., 0., 1., 0., 0., 0., 0.], 
     [ 0., 0., 1., 0., 0., 0., 0., 0.]]) 

Флип массива в влево/вправо

In [55]: f = np.fliplr(a) 

In [56]: f 
Out[56]: 
array([[ 0., 1., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 1., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 1., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 1., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 1., 0., 0.]]) 

То же самое можно сделать:

In [71]: a[::-1,:] 
Out[71]: 
array([[ 0., 0., 1., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 1., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 1., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 1., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 1., 0.]]) 

получить данные диагональную

In [57]: np.diag(f, k=1) 
Out[57]: array([ 1., 1., 1., 1., 1.]) 

In [58]: np.diag(f, k=-1) 
Out[58]: array([ 0., 0., 0., 0.]) 

In [111]: a[::-1].diagonal(2) 
Out[111]: array([ 1., 1., 1., 1., 1.]) 

проверить содержит ли вся диагональ 1 s

In [61]: np.all(np.diag(f, k=1) == 1) 
Out[61]: True 

или

In [64]: (np.diag(f, k=1) == 1).all() 
Out[64]: True 

In [65]: (np.diag(f, k=0) == 1).all() 
Out[65]: False 

This answer поможет вам найти все диагонали s

PS я новичок в NumPy, поэтому я уверен, что там должно быть быстрее и более элегантные решения

+0

Мне нужно будет прочитать это и связанное сообщение с некоторыми деталями, чтобы понять это. Я постараюсь вернуться с вами, как только смогу. – paperstsoap

+0

Похоже, что это сработает для определения диагонали в матрице, но для моей проблемы я не знаю достаточно информации, чтобы использовать ее точно. – paperstsoap

+0

'rot90' также полезная функция, чтобы иметь в виду в этом контексте. – percusse