我需要找到大型列表中与子列表匹配的索引。
c = np.array(close)
EMA50 = np.array(MA50)
sublist = [False,True,True]
biglist = (c-EMA50)/c>0.01
>>>array([False, False, False, False, False, False, False, False, False,
False, False, False, False, True, True, True, True, True,
True, True, True, True, True, True, True, True, True,
True, False, False, True, False, True, True, False, False,
True, False, False, False, False, False, False, False, True,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, True, True, True,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, True, True, True, True], dtype=bool)
>>>sublist in biglist
>>>False
我期待True,但它返回False。
所需的输出是
index_loc = [12,31,68,112]
答案 0 :(得分:2)
使用slicing
的sublist
模式并检查该签名并获取索引的一个非常简单的解决方案是 -
np.flatnonzero(~a[:-2] & a[1:-1] & a[2:]) # a as data array
<强>解释强>
基本上,我们正在从数据数组中切出三个切片 - 一个从第0个索引开始直到遗漏最后两个元素,另一个从第一个索引开始,到第二个最后一个元素结束,第三个切片从第二个元素开始并一直持续到最后。这三个切片对应于sublist
模式所需的三个匹配元素 - [False, True, True]
。我们需要确保第一个是False
,换句话说,让我们确保对它的否定是True
。 NumPy中的否定是通过~
运算符实现的。因此,实质上,我们从这三个切片中获取组合掩码,并使用np.flatnonzero
获得相应的索引。
对于给定的数据结果 -
In [79]: np.flatnonzero(~a[:-2] & a[1:-1] & a[2:])
Out[79]: array([ 12, 31, 68, 112])
答案 1 :(得分:0)
in
无法检查子阵列。相反,它会检查元素。
你必须做这样的事情:
(对于大数组使用A
,为了可读性,使用b
作为子列表。)
n = len(b)
c = [i for i in xrange(len(A)-n+1) if (b==A[i:i+n]).all()]
c
是必需的索引列表。
<强>解释强>
这是python中的基本列表理解
我们的想法是创建bigarray的子数组并检查它是否与子列表匹配。
打破声明以便更好地理解:
c = []
for i in xrange(len(A)-n+1):
if (b==A[i:i+n]).all(): # if list and arrays match
c.append(i)