Home > Back-end >  How to find min and max on 2D array in Python
How to find min and max on 2D array in Python

Time:06-16

A rainfall sensor monitors the average rainfall over a year. It records the total once each day per week and all 52 weeks in a year. The program will then

  • Display the total rainfall for each week
  • Display the total for the year
  • The smallest and largest amount of rainfall in a single week.

The following program reads data from a CSV file and then populates the array one row at a time. So far, the program can calculate the total rainfall for the year by traversing each row of the array at a time and incrementing a total. I am not sure how to find the total rainfall from each week with the smallest and largest amount of rainfall that week.

CODE

import random

#global variables
rows = 52
cols = 7

def initArray():
    newArray = [[None]*cols for i in range(rows)]
    return newArray

def populateArray(arrayname,filename):
    rowcounter = 0
    colcounter = 0
    with open(filename) as readfile:
        line = readfile.readline().rstrip('\n')
        while line:
            #read the line of a file
            items = line.split(",")
            print("Items = ", items)
            #reset the colcounter to ensure first item is placed
            #at first position in the 2D array
            colcounter = 0
            #for the length of the array
            for x in range(len(items)):
                #place the new values into the array a row at a time
                arrayname[rowcounter][colcounter] = int(items[colcounter])
                #increment the column counter
                colcounter  = 1
            #increment the row counter
            rowcounter  = 1
            line = readfile.readline().rstrip('\n')

    return arrayname

def yearly(arrayname):
    total = 0
    for x in range(len(arrayname)):
        for y in range(len(arrayname[x])):
            total  = arrayname[x][y]

    return total

rainfall = initArray()
rainfall = populateArray(rainfall,"rainfall.csv")
total = yearly(rainfall)

print("The total rainfall for the year was",str(total))

output:

Items =  ['2', '16', '10', '2', '12', '9', '9']
Items =  ['2', '29', '17', '16', '13', '18', '7']
Items =  ['22', '15', '27', '19', '6', '26', '11']
Items =  ['21', '7', '18', '4', '14', '14', '2']
Items =  ['6', '30', '12', '4', '26', '22', '11']
Items =  ['21', '16', '14', '11', '28', '20', '3']
Items =  ['19', '10', '22', '18', '30', '9', '27']
Items =  ['8', '15', '17', '4', '11', '16', '6']
Items =  ['19', '17', '16', '6', '18', '18', '6']
Items =  ['2', '15', '3', '25', '27', '16', '11']
Items =  ['15', '5', '26', '24', '24', '30', '5']
Items =  ['15', '11', '16', '22', '14', '23', '28']
Items =  ['25', '6', '7', '20', '26', '18', '16']
Items =  ['5', '5', '21', '22', '24', '16', '5']
Items =  ['6', '27', '11', '8', '24', '1', '16']
Items =  ['28', '4', '1', '4', '3', '19', '24']
Items =  ['19', '3', '27', '14', '12', '24', '0']
Items =  ['6', '3', '26', '15', '15', '22', '26']
Items =  ['18', '5', '0', '14', '15', '7', '26']
Items =  ['10', '5', '12', '22', '8', '7', '11']
Items =  ['11', '1', '18', '29', '6', '9', '26']
Items =  ['3', '23', '2', '21', '29', '15', '25']
Items =  ['5', '7', '1', '6', '15', '18', '24']
Items =  ['28', '11', '0', '6', '28', '11', '26']
Items =  ['4', '28', '9', '24', '11', '13', '2']
Items =  ['6', '2', '14', '18', '20', '21', '1']
Items =  ['20', '29', '22', '21', '11', '14', '20']
Items =  ['28', '23', '14', '17', '25', '3', '18']
Items =  ['6', '27', '6', '20', '19', '5', '24']
Items =  ['25', '3', '27', '22', '7', '12', '21']
Items =  ['12', '22', '8', '7', '0', '11', '8']
Items =  ['8', '25', '1', '6', '21', '23', '0']
The total rainfall for the year was 5344

CSV Data

0,0,30,2,21,13,23
29,3,29,30,7,8,25
26,5,26,13,4,13,4
22,30,13,15,15,0,2
3,12,11,10,17,0,15
8,13,11,24,30,24,27
22,18,2,29,11,13,18
15,1,29,23,18,7,0
23,27,3,7,13,14,28
6,25,24,14,20,23,5
24,29,26,22,0,9,18
22,27,22,20,24,29,21
23,13,14,4,13,1,21
25,21,21,6,28,17,19
4,6,11,10,21,1,5
11,7,22,11,10,24,15
25,11,23,3,23,8,3
22,23,0,29,15,12,5
21,11,18,22,1,4,3
11,10,3,1,30,14,22
2,16,10,2,12,9,9
2,29,17,16,13,18,7
22,15,27,19,6,26,11
21,7,18,4,14,14,2
6,30,12,4,26,22,11
21,16,14,11,28,20,3
19,10,22,18,30,9,27
8,15,17,4,11,16,6
19,17,16,6,18,18,6
2,15,3,25,27,16,11
15,5,26,24,24,30,5
15,11,16,22,14,23,28
25,6,7,20,26,18,16
5,5,21,22,24,16,5
6,27,11,8,24,1,16
28,4,1,4,3,19,24
19,3,27,14,12,24,0
6,3,26,15,15,22,26
18,5,0,14,15,7,26
10,5,12,22,8,7,11
11,1,18,29,6,9,26
3,23,2,21,29,15,25
5,7,1,6,15,18,24
28,11,0,6,28,11,26
4,28,9,24,11,13,2
6,2,14,18,20,21,1
20,29,22,21,11,14,20
28,23,14,17,25,3,18
6,27,6,20,19,5,24
25,3,27,22,7,12,21
12,22,8,7,0,11,8
8,25,1,6,21,23,0

CodePudding user response:

I've seen some suggestions for pandas, which would also work well, but for something simple like this you may just want to use numpy:

import numpy as np

rainfall = np.loadtxt(filename, delimiter=',')
total = rainfall.sum()

print(f"The total rainfall for the year was {total:.0f}")
print(f"Overall Min: {rainfall.min()}")
print(f"Overall Max: {rainfall.max()}")
print("Weekly Sums:")
print(rainfall.sum(axis=1))
print("Weekly Mins:")
print(rainfall.min(axis=1))

Output:

The total rainfall for the year was 5344
Overall Min: 0.0
Overall Max: 30.0
Weekly Sums:
[ 89. 131.  91.  97.  68. 137. 113.  93. 115. 117. 128. 165.  89. 137.
  58. 100.  96. 106.  80.  91.  60. 102. 126.  80. 111. 113. 135.  77.
 100.  99. 129. 129. 118.  98.  93.  83.  99. 113.  85.  75. 100. 118.
  76. 110.  91.  82. 137. 128. 107. 117.  68.  84.]
Weekly Mins:
[ 0.  3.  4.  0.  0.  8.  2.  0.  3.  5.  0. 20.  1.  6.  1.  7.  3.  0.
  1.  1.  2.  2.  6.  2.  4.  3.  9.  4.  6.  2.  5. 11.  6.  5.  1.  1.
  0.  3.  0.  5.  1.  2.  1.  0.  2.  1. 11.  3.  5.  3.  0.  0.]

CodePudding user response:

from itertools import chain

array_max = max(chain(*arrayname))
array_min = min(chain(*arrayname))

Note that if you didn't convert the values to int first, then min and max will be the lowest and highest individual digits, because min and max will be checking character by character in the strings.

(edited to clarify what happens if you didn't convert to int)

  • Related