Python:numpy数组子列表与序列重要的大列表匹配

时间:2017-02-08 08:15:32

标签: python numpy

我需要找到大型列表中与子列表匹配的索引。

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] 

2 个答案:

答案 0 :(得分:2)

使用slicingsublist模式并检查该签名并获取索引的一个非常简单的解决方案是 -

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)