Python中的数组排序问题

时间:2014-05-04 17:34:27

标签: python numpy

我正在尝试对数据(x)进行排序,并查找每条记录多于先前记录的次数。我从我的范围中的第二个记录(索引1)开始,然后比较从索引0到i的最大值。我很难过,并试图将其分解为步骤而不确定它是如何失败的?任何人都可以提供任何见解吗?非常感谢,希望我能正确解释。

def greater(x):
g=0
for i in range(len(x[1:])):
    if x[i] > np.max(x[:i]):
        g = g + 1            
return g

预期结果:

X = [0,1,1,5,4] g应该= 2,记录指数为1,3

3 个答案:

答案 0 :(得分:1)

你正在执行你的错误循环

应该是:

for i in range(1,len(x)):

因为您希望将值从1 循环到长度x ,而您的代码将从0 循环到长度x减1

顺便说一句。它与“数组理解”无关

存储当前最大值而不是执行np.max(x[:i])(线性)也会更有效。

答案 1 :(得分:1)

您可以使用numpy对此进行矢量化,如下所示:

>>> x = [0, 1, 1, 5, 4]
>>> np.count_nonzero(x[1:] > np.maximum.accumulate(x)[:-1])
2

要了解发生了什么:

>>> np.maximum.accumulate(x)
array([0, 1, 1, 5, 5])
>>> x[1:] > np.maximum.accumulate(x)[:-1]
array([ True, False,  True, False], dtype=bool)

您可以通过以下方式获取g增加的位置的索引:

>>> np.nonzero(x[1:] > np.maximum.accumulate(x)[:-1])[0] + 1
array([1, 3], dtype=int64)

答案 2 :(得分:0)

正如lejlot所说,没有必要每次都重新计算所有先前列表项的最大值 - 只需记录一次列表中的运行最大值。这也意味着您不需要继续重复列表,因此您不必跟踪列表中的当前位置 - 只是当前项目 - 因此,您不需要&#39 ; t也需要range()len()。这导致了一个非常简单的实现:

def greater(x):
    g = 0
    newmax = x[0]
    for i in x[1:]:
        if i > newmax:
            g += 1
            newmax = i
    return g