我有一个从一条线的渐变派生的整数数组。该数组称为sign_slope,如下所示:
sign_slope = array([-1, 1, -1, ..., -1, -1, -1])
我正在搜索数组中连续项目的情况:1,-1 例如,您可以从sign_slope的上述输出中看到: sign_slope [1] = 1,sign_slope [2] = -1 这将是我想要检测项目/索引号的许多人的第一个案例。我希望代码在上述情况下输出对应于第(n-1)个索引的索引号的数组或列表,即sign_slope [1]。 我写了下面的印刷声明似乎有效。但是,我不知道如何输出索引号而不是当前的值,并将它们附加到列表或将它们输入到数组中。
for n in range(0, len(sign_slope)):
if sign_slope[n] < 0 and sign_slope[n - 1] > 0:
print sign_slope[n - 1]
else:
print 0
谢谢提前,
凯恩
答案 0 :(得分:4)
对一系列指标的循环通常被认为是非常不合理的。它读得很差,掩盖了你真正想做的事情。因此,找到子列表的更好解决方案是循环使用enumerate()
内置函数来获取值和值。我们还可以提供更通用的解决方案,并使其成为易于使用的生成器。
def find_sublists(seq, sublist):
length = len(sublist)
for index, value in enumerate(seq):
if value == sublist[0] and seq[index:index+length] == sublist:
yield index
我们在这里做的是遍历列表,获取值与子列表的开头匹配的指标。然后我们检查列表的那个段是否与我们的子列表匹配,如果是,我们yield
索引。这使我们能够快速找到列表中的所有匹配的子列表。
我们可以这样使用它,使用list
内置来从生成器创建列表:
>>> list(find_sublists([-1, 1, -1, -1, -1, 1, -1], [1, -1]))
[1, 5]
答案 1 :(得分:0)
假设您的数组sign_slope
是numpy
数组,您可以在不编写循环的情况下执行此操作:
import numpy as np
# some data
sign_slope = np.array([-1, 1, -1, 1, 1, -1, -1])
# compute the differences in s
d = np.diff(sign_slope)
# compute the indices of elements in d that are nonzero
pos = np.where(d != 0)[0]
# elements pos[i] and pos[i]+1 are the indices
# of s that differ:
print s[pos[i]], s[pos[i]+1]
这是一个显示变量值的ipython会话:
In [1]: import numpy as np
In [2]: s = np.array([-1, 1, -1, 1, 1, -1, -1])
In [3]: d = np.diff(s)
In [4]: print d
[ 2 -2 2 0 -2 0]
In [5]: pos = np.where(d != 0)[0]
In [6]: print pos
[0 1 2 4]
In [7]: print s[pos[0]], s[pos[0]+1]
-1 1
In [8]: print s[pos[1]], s[pos[1]+1]
1 -1
In [9]: print s[pos[2]], s[pos[2]+1]
-1 1
In [10]: print s[pos[3]], s[pos[3]+1]
1 -1
希望这有帮助
编辑:实际上,回想起来,我错过了一些差异。我会回复你的。抱歉有任何困惑。
编辑2:固定,我犯了一个愚蠢的错误。