查找数组

时间:2016-03-13 05:38:42

标签: python

def maxvalues():        
for n in range(1,15):
    dummy=[]
    for k in range(len(MotionsAndMoorings)):
        dummy.append(MotionsAndMoorings[k][n])
    max(dummy)
    L = [x + [max(dummy)]] ## to be corrected (adding columns with value max(dummy))
## suggest code to add new row to L and for next function call, it should save values here.

我有一个大小(k x n)的数组,我需要选择该数组中第一列的最大值。请建议除了我尝试之外还有更简单的方法吗?我的主要目的是将它附加到列中而不是行中。如果我只是追加,它会在最后添加值。我希望在L中的第0行的列中完成此操作,因为我将再次调用此函数并向L添加新行并执行相同操作。请建议。

2 个答案:

答案 0 :(得分:3)

代码的一般建议

首先,在函数中访问全局变量并不是很方便。它有效,但它不被认为是好的风格。所以不要使用:

def maxvalues():
    do_something_with(MotionsAndMoorings)

你应该用一个参数来做:

def maxvalues(array):
    do_something_with(array)

MotionsAndMoorings = something
maxvalues(MotionsAndMoorings) # pass it to the function.

下一个奇怪的是你似乎排除了数组的第一行:

for n in range(1,15):

我认为这是无意识的。列表的第一个元素具有索引0而不是1。所以我想你想写一下:

for n in range(0,15):
对于任意长度,

甚至更好:

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

迭代的替代方法

但这不是很直观,因为max函数已经实现了一些非常好的关键字(key),所以你不需要迭代整个数组:

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

这将返回第i个元素最大的行(您只需将您想要的列定义为此元素)。但是最大值将返回整行,因此您只需要提取第i个元素。

因此,要获得您可以执行的每个列的所有最大值的列表:

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

对于你的L我不知道这是什么,但是你应该把它作为参数传递给函数:

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

但由于我不知道xL应该是什么,所以我不会再进一步​​了解。但看起来您希望将MotionsAndMoorings的列设置为行,将行设置为列。如果是这样,你可以用:

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

这是一个列表修改,可以转换列表,如:

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

to"倒置"列/行列表:

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

替代套餐

但是像roadrunner66已经说过,有时最简单的方法是使用像numpypandas这样的库,这些库已经具有非常先进和快速的功能,可以完全按照您的要求进行操作,并且非常容易使用

例如,您可以通过以下方式将python列表转换为numpy数组:

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

使用以下方法获取最大列:

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

您甚至不需要将其转换为np.array以使用np.max或转置它(将行设置为列,将列设置为行):

transposed = np.transpose(MotionsAndMoorings)

我希望这个答案不是非结构化的。有些部分是对你的功能的建议,有些是替代品。您应该选择所需的部件,如果您遇到任何问题,只需发表评论或提出其他问题。 : - )

答案 1 :(得分:1)

带有随机输入数组的示例,显示您可以使用一个命令轻松地在任一轴中使用max

import numpy as np

aa= np.random.random([4,3]) 
print aa
print
print np.max(aa,axis=0)
print
print np.max(aa,axis=1)

输出:

[[ 0.51972266  0.35930957  0.60381998]
 [ 0.34577217  0.27908173  0.52146593]
 [ 0.12101346  0.52268843  0.41704152]
 [ 0.24181773  0.40747905  0.14980534]]

[ 0.51972266  0.52268843  0.60381998]

[ 0.60381998  0.52146593  0.52268843  0.40747905]