Hướng dẫn how do you find the average of a 2d list in python? - làm cách nào để bạn tìm thấy mức trung bình của danh sách 2d trong python?

Nếu bạn muốn, bạn có thể sử dụng gói Numpy và chức năng của nó ____10.

Để tính toán điểm trung bình của mỗi học sinh, được đưa ra

80.0
40.0
1, mã sẽ giống như:

import numpy

def print_student_average(myList):
    students_avg = numpy.mean(myList, axis=1)
    for avg in students_avg:
        print(avg)
    return students_avg

Lưu ý rằng

80.0
40.0
2 xác định rằng trung bình được tính toán trên các hàng. Với danh sách trong ví dụ được cung cấp, đầu ra là:

80.0
40.0

Tương tự, bạn có thể nhận được trung bình cho mỗi bài kiểm tra bằng cách sử dụng cùng một hàm Numpy:

def print_exams_average(myList):
    exams_avg = numpy.mean(myList, axis=0)
    for avg in exams_avg:
        print(avg)
    return exams_avg

Trong trường hợp này

80.0
40.0
3 để có được trung bình qua các cột và kết quả cho danh sách được cung cấp trong ví dụ là:

50.0
60.0
70.0

Về vấn đề trong

80.0
40.0
4 của bạn,

 total_sum = [sum(i) for i in range(len(myList))]

là vấn đề chính.

80.0
40.0
5 Trả về một danh sách các số nguyên bắt đầu từ 0 đến độ dài của danh sách, trong ví dụ là 2. với câu lệnh
80.0
40.0
6, bạn lặp lại từng giá trị của danh sách từ
80.0
40.0
5, và sau đó bạn đang cố gắng sử dụng
80.0
40.0
8 trên một số nguyên, mà không hoạt động vì nó không phải là một danh sách. Giải pháp theo dõi chặt chẽ hơn mã của bạn đã được cung cấp trong một câu trả lời khác.

Trong bài viết trước của tôi, nơi tôi tìm thấy trung bình của một danh sách trong Python mà không cần sử dụng nhập khẩu, trong bài viết này tôi muốn mở rộng cách bạn có thể áp dụng cùng một khái niệm, nhưng cho các danh sách hai chiều. Rất may, nếu bạn biết cách tìm mức trung bình của một danh sách một chiều trong Python, bạn chỉ cần mở rộng kiến ​​thức này để tìm mức trung bình của một danh sách hai chiều.

Câu hỏi lớn để hỏi, khi tìm thấy trung bình của một danh sách hai chiều, đang tìm kiếm điều gì mà bạn muốn trung bình: toàn bộ danh sách, hoặc chỉ là trung bình của mỗi hàng, hoặc nó là trung bình của mỗi danh sách?

Ở đây, một danh sách 2 chiều đơn giản hiển thị một số kết quả theo loại trung bình nào được tìm kiếm:

[[1, 2, 3],
 [3, 4, 5],
 [5, 6, 13]]
# average of each cell = 36 / 9 = 4.6667
# average of each row = (6 + 12 + 18) / 3 = 14
# average of each column = (9 + 12 + 21) / 3 = 14
# average of each row as list = [2, 4, 8]
# average of each column as list = [3, 4, 7]
# average of the rows = (2 + 4 + 8) / 3 = 4.6667
# average of the columns = (3 + 4 + 7) = 4.6667

Để tính trung bình của mỗi ô, tất cả những gì cần thiết là thu được các giá trị của tất cả các ô số trong danh sách 2D, sau đó tổng hợp các nội dung của các giá trị số đó và chia cho số lượng giá trị số.

Chúng tôi có thể dễ dàng đạt được kỳ tích này bằng cách nắm bắt tất cả các giá trị vào một danh sách, và sau đó áp dụng những gì chúng tôi đã học được trước đây bằng cách lấy trung bình một danh sách trong Python mà không cần sử dụng bất kỳ thư viện nào.

Nhưng làm thế nào chúng ta sẽ tính toán trung bình của mỗi hàng hoặc cột trong danh sách 2D trong Python?

Có thể cùng một khái niệm được áp dụng để tính toán trung bình của các yếu tố này trong danh sách 2D?

Vâng, họ có thể!

Tính trung bình mỗi hàng & cột

Để tính trung bình của mỗi hàng hoặc cột trong danh sách 2D, chúng ta cần lưu trữ nội dung của các giá trị số trong mỗi hàng và cột.

Cách tốt nhất để lưu trữ các giá trị này là sử dụng

80.0
40.0
9 để hoạt động dưới dạng nhận dạng hàng hoặc cột và sau đó nối tất cả các giá trị số vào
80.0
40.0
9 đó.

Khi chúng tôi có một danh sách các số, chúng tôi có thể chỉ cần áp dụng những gì chúng tôi đã biết về cách lấy trung bình của một danh sách.

Hãy để tạo ra một chức năng có thể tạo tất cả các mức trung bình này, chúng tôi sẽ sử dụng một hàm để giúp phối hợp tính toán.

def calculate_averages(list_2d):
    cell_total = list()
    row_totals = dict()
    column_totals = dict()
    for row_idx, row in enumerate(list_2d):
        for cell_idx, cell in enumerate(row):
            # is cell a number?
            if type(cell) in [int, float, complex]:
                cell_total.append(cell)                
                if row_idx in row_totals:
                    row_totals[row_idx].append(cell)
                else:
                    row_totals[row_idx] = [cell]
                if cell_idx in column_totals:
                    column_totals[cell_idx].append(cell)
                else:
                    column_totals[cell_idx] = [cell]
    per_row_avg = [sum(row_totals[row_idx]) / len(row_totals[row_idx]) for row_idx in row_totals]
    per_col_avg = [sum(column_totals[col_idx]) / len(column_totals[col_idx]) for col_idx in column_totals]
    row_avg = sum(per_row_avg) / len(per_row_avg)
    col_avg = sum(per_col_avg) / len(per_col_avg)
    return {'cell_average': sum(cell_total) / len(cell_total),
            'per_row_average': per_row_avg,
            'per_column_average': per_col_avg,
            'row_average': row_avg,
            'column_average': col_avg}


data = [['this', 'is a', 'header row'], [1, 2, 3], [3, 4, 5], [5, 6, 13]]

result = calculate_averages(data)

print(result)

# {'cell_average': 4.666666666666667, 'per_row_average': [2.0, 4.0, 8.0], 'per_column_average': [3.0, 4.0, 7.0], 'row_average': 4.666666666666667, 'column_average': 4.666666666666667}

Hàm này thực hiện một vòng lặp qua mỗi hàng, và sau đó thông qua mỗi ô trong hàng. Do đó, tại sao chúng ta có hai vòng lặp để phù hợp với kích thước của danh sách hai chiều.

Tất cả các hoạt động được thực hiện ở cấp độ ô, nơi trước tiên chúng tôi kiểm tra giá trị của ô là số. Như bạn có thể thấy với biến

def print_exams_average(myList):
    exams_avg = numpy.mean(myList, axis=0)
    for avg in exams_avg:
        print(avg)
    return exams_avg
1, tôi đã thêm một hàng tiêu đề vào danh sách 2D, vì đây không phải là số các mục này cần được lọc ra từ các tính toán trung bình.not numeric these items need to be filtered out from the average calculations.

Khi chúng tôi đã lọc các giá trị số, sau đó chúng tôi nối nó vào danh sách

def print_exams_average(myList):
    exams_avg = numpy.mean(myList, axis=0)
    for avg in exams_avg:
        print(avg)
    return exams_avg
2 của chúng tôi - đây là danh sách sẽ cung cấp trung bình đơn giản của tất cả các giá trị số trong danh sách.of all numeric values in the list.

Sau đó, chúng tôi di chuyển đến phần hàng và cột, như được hiển thị bên dưới:

if row_idx in row_totals:
    row_totals[row_idx].append(cell)
else:
    row_totals[row_idx] = [cell]
if cell_idx in column_totals:
    column_totals[cell_idx].append(cell)
else:
    column_totals[cell_idx] = [cell]

Trong phần này, chúng tôi kiểm tra xem một định danh đại diện cho hàng hoặc cột tồn tại trên từ điển cho mỗi hàng tiếp theo_totals và cột_totals. Định danh trong trường hợp này lần lượt là

def print_exams_average(myList):
    exams_avg = numpy.mean(myList, axis=0)
    for avg in exams_avg:
        print(avg)
    return exams_avg
3 hoặc
def print_exams_average(myList):
    exams_avg = numpy.mean(myList, axis=0)
    for avg in exams_avg:
        print(avg)
    return exams_avg
4.

Nếu các thuộc tính này đã tồn tại trên từ điển, thì chúng tôi nối một phần tử khác vào danh sách hiện có, nếu không chúng tôi sẽ tạo một danh sách với giá trị

def print_exams_average(myList):
    exams_avg = numpy.mean(myList, axis=0)
    for avg in exams_avg:
        print(avg)
    return exams_avg
5 đầu tiên.

Phần cuối cùng của chức năng của chúng tôi trước khi xuất kết quả, là:

per_row_avg = [sum(row_totals[row_idx]) / len(row_totals[row_idx]) for row_idx in row_totals]
per_col_avg = [sum(column_totals[col_idx]) / len(column_totals[col_idx]) for col_idx in column_totals]
row_avg = sum(per_row_avg) / len(per_row_avg)
col_avg = sum(per_col_avg) / len(per_col_avg)

Ở đây, chúng tôi có một vòng lặp một lớp có kết quả của từng danh sách trong từ điển

def print_exams_average(myList):
    exams_avg = numpy.mean(myList, axis=0)
    for avg in exams_avg:
        print(avg)
    return exams_avg
6 và
def print_exams_average(myList):
    exams_avg = numpy.mean(myList, axis=0)
    for avg in exams_avg:
        print(avg)
    return exams_avg
7 của chúng tôi và thực hiện trung bình đơn giản cần thiết: tổng số các giá trị bên trong danh sách và sau đó chia cho số lượng các mục trong danh sách.

Biến

def print_exams_average(myList):
    exams_avg = numpy.mean(myList, axis=0)
    for avg in exams_avg:
        print(avg)
    return exams_avg
8 tạo ra một danh sách đại diện cho trung bình của mỗi hàng. Vấn đề duy nhất ở đây là, nó không hiển thị giá trị
def print_exams_average(myList):
    exams_avg = numpy.mean(myList, axis=0)
    for avg in exams_avg:
        print(avg)
    return exams_avg
9 cho bất kỳ hàng không phải là số. Điều tương tự cũng áp dụng cho biến
50.0
60.0
70.0
0.

Cuối cùng, để có được mức trung bình của một hàng, chúng tôi có được danh sách

def print_exams_average(myList):
    exams_avg = numpy.mean(myList, axis=0)
    for avg in exams_avg:
        print(avg)
    return exams_avg
8 và
50.0
60.0
70.0
0 và sau đó, một lần nữa, áp dụng tính toán trung bình đơn giản của việc tổng hợp các nội dung của danh sách và chia cho số lượng giá trị trong danh sách đó. Bây giờ chúng tôi có trung bình mỗi hàng và trung bình cho mỗi cột.

Bản tóm tắt

Bí quyết để giúp quản lý việc tính toán danh sách hai chiều, trong đó không chắc chắn nếu danh sách chứa các giá trị phù hợp để tính trung bình, là lưu trữ từng hàng và cột trong một chế độ thành một danh sách.

Trong bài viết này, chúng tôi cũng đã chỉ ra cách bạn có thể tính tổng trung bình của tất cả các giá trị số trong danh sách 2D bằng cách sử dụng các hàm của Python (không cần nhập) và cách áp dụng cùng một logic để tính trung bình của các hàng và cột cho 2D của bạn danh sách.

Đây chỉ là chức năng mà bạn sẽ gọi

50.0
60.0
70.0
3 và chèn danh sách 2D của bạn vào các tham số:

def calculate_averages(list_2d):
    cell_total = list()
    row_totals = dict()
    column_totals = dict()
    for row_idx, row in enumerate(list_2d):
        for cell_idx, cell in enumerate(row):
            # is cell a number?
            if type(cell) in [int, float, complex]:
                cell_total.append(cell)                
                if row_idx in row_totals:
                    row_totals[row_idx].append(cell)
                else:
                    row_totals[row_idx] = [cell]
                if cell_idx in column_totals:
                    column_totals[cell_idx].append(cell)
                else:
                    column_totals[cell_idx] = [cell]
    per_row_avg = [sum(row_totals[row_idx]) / len(row_totals[row_idx]) for row_idx in row_totals]
    per_col_avg = [sum(column_totals[col_idx]) / len(column_totals[col_idx]) for col_idx in column_totals]
    row_avg = sum(per_row_avg) / len(per_row_avg)
    col_avg = sum(per_col_avg) / len(per_col_avg)
    return {'cell_average': sum(cell_total) / len(cell_total),
            'per_row_average': per_row_avg,
            'per_column_average': per_col_avg,
            'row_average': row_avg,
            'column_average': col_avg}