Python:寻找匹配大列表中子列表的numpy数组,其中序列很重要。

5
我需要找到大列表中与子列表匹配的索引。
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] 

@Divakar,我已经进行了更正,谢谢。 - bkcollection
2个回答

2

使用sublist模式进行切片,检查该签名并获取索引的一个非常简单的解决方案是 -

np.flatnonzero(~a[:-2] & a[1:-1] & a[2:]) # a as data array

说明

基本上,我们从数据数组中切出了三个片段 - 一个从第0个索引开始,一直到最后两个元素,另一个从第1个索引开始,一直到倒数第二个元素,还有一个从第2个索引开始,一直到结尾。这三个片段对应于匹配所需的三个元素,即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])

谢谢,它有效。你能进一步解释一下它是如何工作的吗?np.flatnonzero(~a[:-2] & a[1:-1] & a[2:]),这里的~a是什么意思,~a[:2]又是什么意思? - bkcollection
@bkcollection 已添加说明。 - Divakar

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 中基本的列表推导式。
其思想是创建大数组的子数组并检查是否与子列表匹配。

为了更好地理解,我们来分解一下这个语句:

c = []    
for i in xrange(len(A)-n+1):
    if (b==A[i:i+n]).all():    # if list and arrays match
        c.append(i)

@bkcollection,添加了解释。谷歌一下__列表推导式__。 - Jithin Pavithran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接