1
votes

calculer la moyenne du tableau imbriqué de manière particulière par python?

J'ai besoin d'un moyen de calculer la moyenne du tableau imbriqué (pair ou impair) de la manière suivante:

disons que nous avons ce tableau (liste) (même 4 * 4):

 mylist = [[70,80,90],
[30,40,50],
[0,10,20],
[10,40,40]]
avglist = []
for x in mylist:
    temp = 0
    counter = 0
    for y in x:     
        temp = temp + y
        counter = counter + 1
    avglist.append(temp/counter)
    print()
print()
print(avglist)

la sortie doit être comme ceci

7 + 9 + 4 + 2 / 4 = 5
1 + 1 / 2 = 1
3 + 2 / 2 = 2
3 / 1 = 3

basé sur ce calcul

mylist = [[5,1],
[2,3]
]

le même chose si nous avons un tableau imbriqué impair comme celui-ci

mylist = [[7,9,1],
[4,2,1],
[3,2,3]]

le résultat serait:

1 + 6 + 2 + 5 / 4 = 3
5 + 6 + 6 + 8 / 4 = 6
7 + 2 + 4 + 4 / 4 = 4
8 + 1 + 7 + 3 / 4 = 4

basé sur le même calcul ci-dessus ..

mylist = [[3,6],
[4,4]
]

alors comment nous pouvons implémenter ce processus par python, notez que je sais comment faire la moyenne normale pour chaque tableau comme simplement augmenter les nombres pour chaque ligne de tableau par ligne et divisé par son nombre ..

mylist = [
[1,6,5,6],
[2,5,6,8],
[7,2,8,1],
[4,4,7,3]
] 

mais dans ce problème .. je suis confronté à un problème pour savoir comment passer au tableau suivant puis je suis revenu au premier tableau et ainsi de suite ....

**

remarque: il doit s'agir d'un tableau carré (longueur de ligne = longueur de colonne)

**


7 commentaires

Pouvez-vous utiliser numpy ou est-ce une contrainte d'utiliser une liste?


ce doit être une liste ...


@pissall le problème est sur l'algorithme en lui-même pas la moyenne .. merci d'avoir répondu


@HussamGold dans votre premier exemple même 4x4, est le calcul 1 + 6 + 5 + 6/4 = 3 supposé être (1 + 6 + 2 + 5) / 4 = 3 < / code>? Aussi, juste pour clarifier, vous ne calculez pas réellement les moyennes, mais plutôt le plancher de la moyenne, n'est-ce pas?


@JethroCao u r droit désolé pour l'erreur .. ouais de manière à devenir 3 au lieu d'un nombre décimal


@HussamGold alors voulez-vous la moyenne arithmétique précise, ou le plancher de la moyenne (si par exemple vous voulez que la réponse finale soit toujours une liste d'entiers)? Et aussi, puis-je supposer que la liste d'entrée sera toujours NxN?


@JethroCao comme si la réponse est 3,5, elle doit être 3, donc oui en utilisant floor. Aussi, nous supposons qu'il est toujours au carré 2 * 2 3 * 3 4 * 4 etc ....


3 Réponses :


0
votes

Je présente un défi de trame: au lieu de compter chaque quadrant un à la fois, comptez tous les quadrants à la fois.

En supposant que nous calculons toujours quatre nombres (les sommes de chaque quadrant, avec un biais vers le quadrant supérieur gauche si les tailles sont inégales), nous pouvons simplement les préparer à l'avance, puis parcourir chaque cellule de la matrice , déterminez dans quel quadrant il se trouve et incrémentez cette somme:

>>> mylist = [
... [1,6,5,6],
... [2,5,6,8],
... [7,2,8,1],
... [4,4,7,3]
... ] 
>>> calculation(mylist)
[[3, 6], [4, 4]]

>>> mylist = [[7,9,1],
... [4,2,1],
... [3,2,3]]
>>> calculation(mylist)
[[5, 1], [2, 3]]

Cas de test:

def calculation(matrix):
    # prepare empty lists for each quadrant
    # we will add each element from the matrix to the list that corresponds to its quadrant
    # then at the end we will take the average of each.
    sums = {
        (True, True):   [],  # top-left
        (True, False):  [],  # top-right
        (False, True):  [],  # bottom-left
        (False, False): [],  # bottom-right
    }
    # scan over each cell by row and column index
    for row in range(len(matrix)):
        for col in range(len(matrix[row])):
            # use boolean checks to index into sums depending on quadrant
            sums[(row < len(matrix) / 2,      # is it in the top half?
                  col < len(matrix[row]) / 2  # is it in the left half?
                )].append(matrix[row][col])
    # calculate and return averages (using integer division instead of true division)
    return [[sum(sums[True, True])   // len(sums[True, True]),     # top-left
             sum(sums[True, False])  // len(sums[True, False])],   # top-right
            [sum(sums[False, True])  // len(sums[False, True]),    # bottom-left
             sum(sums[False, False]) // len(sums[False, False])]]  # bottom-right


0 commentaires

1
votes

D'accord, voici mon essai. C'est un peu verbeux, mais je pense que c'est très facile à suivre.

odd_list = [
[7,9,1],
[4,2,1],
[3,2,3]]

print(avg_mat(odd_list))
--------------------------------------------------
[[5, 1], [2, 3]]
even_list = [
[1,6,5,6],
[2,5,6,8],
[7,2,8,1],
[4,4,7,3]]

print(avg_mat(even_list))
--------------------------------------------------
[[3, 6], [4, 4]]
# helper func to split nested list (NxN matrix) into 4 quadrants
def split_mat(mat):
    n = len(mat)
    s = math.ceil(n/2)
    up_left  = [mat[i][j] for i in range(0, s) for j in range(0, s)]
    up_right = [mat[i][j] for i in range(0, s) for j in range(s, n)]
    bt_left  = [mat[i][j] for i in range(s, n) for j in range(0, s)]
    bt_right = [mat[i][j] for i in range(s, n) for j in range(s, n)]
    return [up_left, up_right, bt_left, bt_right]

# then the averages you want to calculate becomes trivial
def avg_mat(mat):  
    quadrants = split_mat(mat)
    avgs = [sum(q)//len(q) for q in quadrants]
    return [[avgs[0], avgs[1]], [avgs[2], avgs[3]]]


0 commentaires

1
votes

Un peu golfique, désolé, taper sur le téléphone signifie des noms courts :). Je profite de la division entière pour simplement la logique, et utilise les totaux plus la division sur les listes intermédiaires.

from itertools import product

def quad_avgs(M):
  sums = [[0,0],[0,0]]
  L, S, s = len(M), len(M) / 2, len(M) - len(M) / 2
  for r, c in product(range(L), repeat=2):
      sums[r / S][c / S] += M[r][c]
  return [[sums[r][c] / ([S, s][r] * [S, s][c]) for c in [0, 1]] for r in [0, 1]]


0 commentaires