Python Forum
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
array of zeros
#1
Hi, I am just trying to test some code snippets that I got from a teacher in a course I am taking.
This code should work but I am getting errors:
The Python program below handles some measurement data that get stored in an array M.
Explain briefly what the program does and write down the content of M after each iteration of the outer for-loop (i.e. the loop running over “i”).

from numpy import*

N=4
M=zeros(N)
M[0]=2;M[1]=1;M[2]=11;M[3]=7 

for i in range (0,N,1):
    largest=M(i)
    index_largest=i
    for j in range (i+1,N,1):
        if M[j]>largest:
            largest=M[j]
            index_largest=j
        hold_number=M[i]
        M[i]=M[index_largest]
        M[index_largest]=hold_number
    print (M)
Reply
#2
Your code is faulty and won´t run correctly.
I refactored it a little bit.
# This is unpythonic code, don´t code like this

# from numpy import *     # NEVER DO IMPORT *
# N = 4
# M = zeros(N)
# M[0]=2;M[1]=1;M[2]=11;M[3]=7 

import numpy as np

M = np.array([2, 1, 11, 7])
print(M)
N = len(M)

# for i in range (0, N, 1):                   # no need to run till N, N-1 just works
#     largest = M(i)                          # this will throw error, you mean M[i]
#     index_largest = i
#     for j in range (i+1, N, 1):
#         if M[j] > largest:
#             largest = M[j]
#             index_largest = j

#         hold_number = M[i]                  # three lines to swap two values and indentation is wrong
#         M[i] = M[index_largest]
#         M[index_largest] = hold_number

#     print (M)

for i in range(N-1):  #  no need to explicitly give start value zero and step value 1
    largest = M[i]
    index_largest = i
    for j in range(i+1, N):
        if M[j] > largest:
            largest = M[j]
            index_largest = j
            # swapping of values must be done if condition is True
            M[i], M[index_largest] = M[index_largest], M[i]     # one line to swap two values
    print(M)
Output:
[ 2 1 11 7] [11 1 2 7] [11 7 1 2] [11 7 2 1]
I would prefer it this way:
for i in range(N-1):
    smallest = M[i]
    index_smallest = i
    for j in range(i+1, N):
        if M[j] < smallest:
            smallest = M[j]
            index_smallest = j
            M[i], M[index_smallest] = M[index_smallest], M[i]
    print(M)
Output:
[ 2 1 11 7] [ 1 2 11 7] [ 1 2 11 7] [ 1 2 7 11]
Reply


Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020