Liczenie sum tablic 3x3

0

Cześć,
chciałbym wypisac poszczegolne tablice 3x3 z jednej wiekszej tablicy 6x6 plus policzyc sume kazdej z nich. Tablice tworze w taki sposob jak na zdjeciu ponizej ale problem jest taki, ze o ile pierwszy rząd tablic jest ok to nastepne zaczynaja sie zle pomijajac pierwsza iteracje dla kazdego wiersza a dokladniej rzecz biorac, nie rozumiem czemu y zaczyna się wszedzie od 1 a nie od 0. Nie rozumiem tez skąd takie sumy a nie inne.

Tutaj tablica 6x6:

arr = [[-9, -9, -9, 1, 1, 1], 
 [0, -9,  0, 4, 3, 2],
[-9, -9, -9, 1, 2, 3],
 [0, 0,  8, 6, 6, 0],
 [0, 0, 0, -2, 0, 0],
 [0, 0, 1, 2, 4, 0]]

Tutaj kod:

iterator = 0
second_iterator = 0

list_of_sums = []
summ = 0

for x in range(4):
  for y in range(4):
    for z in zip(arr[x][y:], arr[x+1][y:], arr[x+2][y:]):
      #print(x, y)
      summ += sum(z)
      if iterator == 3:
        print()
        list_of_sums.append(summ)
        summ = 0
        iterator = 0
        second_iterator += 1
        break

      iterator += 1
      print(x, y)
      print(z)

  print(20*'-')

print(second_iterator)
print()
print(list_of_sums)

Tutaj przyklad tego jak tworze pierwsze cztery tablice:
screenshot-20220324004834.png
Tutaj następne tablice, niestety tak jak napisalem powyzej, nie rozumiem czemu iteracja zaczyna sie od y = 1 a nie y = 0
screenshot-20220324004936.png
Pozdrawiam.

2

Zacznijmy może od tego żeby to podzielić jak człowiek. Zsumowanie tablicy 3x3 jest proste i możesz zrobić to w osobnej funkcji, a teraz skupić się na funkcji która ma podzielić wejściową tablicę na mniejsze. Bo teraz to zagmatwałeś ten kod niepotrzebnie do tego stopnia że nie wiadomo w ogóle jaki był zamysł.

def sum_array(array):
    return sum([sum(row) for row in array])


def split(array, size):
    result = []
    for start_x in range(len(array) - size + 1):
        for start_y in range(len(array[0]) - size + 1):
            sub_array = [array[y][start_x:start_x + size] for y in range(start_y, start_y + size)]
            print('sub', sub_array)
            result.append(sub_array)
    return result


def main():
    array = [[-9, -9, -9, 1, 1, 1],
             [0, -9, 0, 4, 3, 2],
             [-9, -9, -9, 1, 2, 3],
             [0, 0, 8, 6, 6, 0],
             [0, 0, 0, -2, 0, 0],
             [0, 0, 1, 2, 4, 0]]
    sub_arrays = split(array, 3)
    for sub in sub_arrays:
        print(sub, sum_array(sub))


main()

W skrócie: robie sobie pętlę po współrzędnych "początku" tego wycinku tablicy (lewy górny róg) a potem wyciągam size elementów w prawo i to wszystko dla size wierszy.
Przy okazji ten kod zadziała dla dowolnych tablic, nie tylko 6x6 i potrafi wycinać dowolne kwadraty, nie tylko 3x3.

0

@Shalom: Dziękuje za pomoc. :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1