我正在尝试对数据(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
答案 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