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)
**
3 Réponses :
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
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]]]
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]]
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 ....