Array prüfen ob Werte in folge gleich sind

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Squipy
User
Beiträge: 39
Registriert: Sonntag 30. Juni 2019, 16:42

Hallo,

gibt es eine effiziente Möglichkeit um zu prüfen ob bspw. 5 Zahlenwerte eines arrays in Reihe gleich sind? Wert und Position sind unbekannt.

Besten Dank!
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Array oder Liste?

Die ersten 5? Hat die Liste nur 5 Elemente insgesamt? Wenn du einfach nür prüfen willst ob die gesuchte Sequenz irgendwo in der Liste vorkommt würde ich das so machen, dafür ist die Sequenz die gesucht wird aber erforderlich:

Code: Alles auswählen

numbers = [1,2,3,4,5,6,7]
sequenz_to_look_for_1 = [3,5,6]
sequenz_to_look_for_2 = [2,3,4,5]

print("".join([str(number) for number in sequenz_to_look_for_1]) in "".join([str(number) for number in numbers]))
print("".join([str(number) for number in sequenz_to_look_for_2]) in "".join([str(number) for number in numbers]))
Das ganze kann man auch noch in eine Funktion packen:

Code: Alles auswählen

numbers = [1,2,3,4,5,6,7]
sequenz_to_look_for_1 = [3,5,6]
sequenz_to_look_for_2 = [2,3,4,5]

def check_if_sequenz_is_in_list(list, sequenz):
    return "".join([str(number) for number in sequenz]) in "".join([str(number) for number in list])

print(check_if_sequenz_is_in_list(numbers, sequenz_to_look_for_1))
print(check_if_sequenz_is_in_list(numbers, sequenz_to_look_for_2))
Zuletzt geändert von Jankie am Donnerstag 3. September 2020, 10:05, insgesamt 2-mal geändert.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Code: Alles auswählen

In [1]: import numpy as np

In [2]: werte = np.random.random(30)

In [3]: werte[7:7+5] = werte[7]

In [4]: windows = np.lib.stride_tricks.as_strided(werte, (werte.size - 5 + 1, 5), werte.strides*2)

In [5]: windows.max(axis=1) - windows.min(axis=1)
Out[5]:
array([0.71426446, 0.71426446, 0.80783698, 0.80783698, 0.7449869 ,
       0.7449869 , 0.7449869 , 0.        , 0.1535455 , 0.28254629,
       0.35209247, 0.53512758, 0.53512758, 0.53512758, 0.36881581,
       0.43843173, 0.47240975, 0.47240975, 0.34931615, 0.37189768,
       0.37189768, 0.37189768, 0.39833713, 0.56927844, 0.44090621,
       0.5208942 ])

In [6]: np.where(windows.max(axis=1) - windows.min(axis=1) == 0)
Out[6]: (array([7], dtype=int64),)
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Wenn du zwei Listen hast und nur prüfen willst ob irgendwo in den zwei Listen eine folge von 5 Elementen identisch ist:

Code: Alles auswählen

numbers1 = [1,2,3,4,5,6,7,8,9,10,11]
numbers2 = [1,2,3,4,5,6,7,8,3,10,11]

def have_similarities(list_a, list_b):
    for i in range(len(list_a)):
        sublist_a = list_a[i:i+5]
        if len(sublist_a) == 5:
            for x in range(len(list_b)):
                sublist_b = list_b[x:x+5]
                if sublist_a == sublist_b:
                    print("FOUND")
                    break

have_similarities(numbers1, numbers2)

bzw. so wenn die Anzahl der aufeinanderfolgenden Zahlen variabel ist.

Code: Alles auswählen

numbers1 = [1,2,3,4,5,6,7,8,9,10,11]
numbers2 = [1,2,3,4,5,6,7,7,3,10,11]

def have_similarities(list_a, list_b, sequenz_lenght):
    for i in range(len(list_a)):
        sublist_a = list_a[i:i+sequenz_lenght]
        if len(sublist_a) == sequenz_lenght:
            for x in range(len(list_b)):
                sublist_b = list_b[x:x+sequenz_lenght]
                if sublist_a == sublist_b:
                    return True                   
    return False
                

print(have_similarities(numbers1, numbers2, 8))
Benutzeravatar
kbr
User
Beiträge: 1508
Registriert: Mittwoch 15. Oktober 2008, 09:27

@Sirius3: Was numpy nicht alles so bietet. Mit dem Trick erkennt man auch, ob es mehr als fünf Elemente in Folge sind.
Squipy
User
Beiträge: 39
Registriert: Sonntag 30. Juni 2019, 16:42

Sirius3 hat geschrieben: Donnerstag 3. September 2020, 10:04

Code: Alles auswählen

In [1]: import numpy as np

In [2]: werte = np.random.random(30)

In [3]: werte[7:7+5] = werte[7]

In [4]: windows = np.lib.stride_tricks.as_strided(werte, (werte.size - 5 + 1, 5), werte.strides*2)

In [5]: windows.max(axis=1) - windows.min(axis=1)
Out[5]:
array([0.71426446, 0.71426446, 0.80783698, 0.80783698, 0.7449869 ,
       0.7449869 , 0.7449869 , 0.        , 0.1535455 , 0.28254629,
       0.35209247, 0.53512758, 0.53512758, 0.53512758, 0.36881581,
       0.43843173, 0.47240975, 0.47240975, 0.34931615, 0.37189768,
       0.37189768, 0.37189768, 0.39833713, 0.56927844, 0.44090621,
       0.5208942 ])

In [6]: np.where(windows.max(axis=1) - windows.min(axis=1) == 0)
Out[6]: (array([7], dtype=int64),)
Klasse, wie immer!
Danke
Antworten