finding the max of a column in an array

前端 未结 2 892
猫巷女王i
猫巷女王i 2021-01-18 19:59
def maxvalues():        
for n in range(1,15):
    dummy=[]
    for k in range(len(MotionsAndMoorings)):
        dummy.append(MotionsAndMoorings[k][n])
    max(dummy         


        
2条回答
  •  情歌与酒
    2021-01-18 20:27

    General suggestions for your code

    First of all it's not very handy to access globals in a function. It works but it's not considered good style. So instead of using:

    def maxvalues():
        do_something_with(MotionsAndMoorings)
    

    you should do it with an argument:

    def maxvalues(array):
        do_something_with(array)
    
    MotionsAndMoorings = something
    maxvalues(MotionsAndMoorings) # pass it to the function.
    

    The next strange this is you seem to exlude the first row of your array:

    for n in range(1,15):
    

    I think that's unintended. The first element of a list has the index 0 and not 1. So I guess you wanted to write:

    for n in range(0,15):
    

    or even better for arbitary lengths:

    for n in range(len(array[0])): # I chose the first row length here not the number of columns
    

    Alternatives to your iterations

    But this would not be very intuitive because the max function already implements some very nice keyword (the key) so you don't need to iterate over the whole array:

    import operator
    column = 2
    max(array, key=operator.itemgetter(column))[column]
    

    this will return the row where the i-th element is maximal (you just define your wanted column as this element). But the maximum will return the whole row so you need to extract just the i-th element.

    So to get a list of all your maximums for each column you could do:

    [max(array, key=operator.itemgetter(column))[column] for column in range(len(array[0]))]
    

    For your L I'm not sure what this is but for that you should probably also pass it as argument to the function:

    def maxvalues(array, L): # another argument here
    

    but since I don't know what x and L are supposed to be I'll not go further into that. But it looks like you want to make the columns of MotionsAndMoorings to rows and the rows to columns. If so you can just do it with:

    dummy = [[MotionsAndMoorings[j][i] for j in range(len(MotionsAndMoorings))] for i in range(len(MotionsAndMoorings[0]))]
    

    that's a list comprehension that converts a list like:

    [[1, 2, 3], [4, 5, 6], [0, 2, 10], [0, 2, 10]]
    

    to an "inverted" column/row list:

    [[1, 4, 0, 0], [2, 5, 2, 2], [3, 6, 10, 10]]
    

    Alternative packages

    But like roadrunner66 already said sometimes it's easiest to use a library like numpy or pandas that already has very advanced and fast functions that do exactly what you want and are very easy to use.

    For example you convert a python list to a numpy array simple by:

    import numpy as np
    Motions_numpy = np.array(MotionsAndMoorings)
    

    you get the maximum of the columns by using:

    maximums_columns = np.max(Motions_numpy, axis=0)
    

    you don't even need to convert it to a np.array to use np.max or transpose it (make rows to columns and the colums to rows):

    transposed = np.transpose(MotionsAndMoorings)
    

    I hope this answer is not to unstructured. Some parts are suggestions to your function and some are alternatives. You should pick the parts that you need and if you have any trouble with it, just leave a comment or ask another question. :-)

提交回复
热议问题